2011-05-30 51 views
1

當我訪問從JSF一個JPA管理的日期值,它回來與javax.faces.component.UdateModelException說日期轉換例外

'Cannot convert 01.01.10 00:00 of type class java.util.Date to class org.apache.openjpa.util.java$util$Date$proxy 

使用JPA管理日期值(意味着它是代理)工作正常時,它是直接從EL使用喜歡這樣的:

'<h:outputLabel value="MyDateValue" for="input"/> 
'<h:inputText id="inputDate" value="#{bean.myDate}"/> 

但是,它會導致試圖與複合材料部件 使用它的時候麻煩,還給下面的轉換器的異常,因此可以」 t更新模型...

的(簡化的)JSF複合部件inputDate.xhtml

<head> 
      <title>A date input field</title> 
    </head> 

    <composite:interface> 
      <composite:attribute name="dateValue"/> 
    </composite:interface> 

    <composite:implementation> 
      <h:outputLabel value="MyDateValue" for="input"/> 
      <h:inputText id="input" value="#{cc.attrs.dateValue}"/> 
    </composite:implementation> 

假設: 看來代理替換OpenJPA中的處理方式不同,當正在從複合內部訪問的值。我的猜測是,EL解析器在傳遞給組合時處理對對象值的調用。將它傳遞給組合意味着它首先在組合中進行訪問,這太遲了,代理的所需替換未完成(因此轉換器異常)

因此,我嘗試更改MyFaces的表達式語言,但它在Websphere中不起作用,即使我最後將類加載更改爲父項,並在lib文件夾中提供了來自glassfish的el-impl和el-api,併爲MyFaces插入了必要的上下文參數

你們如何使用JPA管理日期(或其他代理實體)在複合組件?

+0

你似乎暗示它在不使用複合組件時會起作用(所以當直接在頁面中使用組件時,「常用方法」)。這是真的? – BalusC 2011-05-30 12:44:21

+0

@BalusC對。使用它「直接」按預期工作。我發現MyFaces Resolver可以按照https://cwiki.apache.org/MYFACES/elresolver-ordering.html排序,並且對它起了一點作用,但沒有成功。使用不同的ELFactoryImpl(JBoss El 2.0.1)可以實現JPA代理日期的訣竅,儘管在WebSphere 8中註冊它非常棘手。但是方法調用不再適用於該el ... – jonnie119 2011-05-30 14:15:22

+0

我從來沒有之前看過這個問題,但我也沒有使用MyFaces。你有沒有機會嘗試莫哈拉而不是MyFaces,儘管它只是排除其中的一個。 – BalusC 2011-05-30 14:17:08

回答

1

如果您使用的是太陽的EL實現您可以使用以下ELResolver其解決此問題的工作:

public class BugfixELResolver extends ELResolver { 
//... 
@Override 
public Class<?> getType(ELContext anElContext, Object aBase, Object aProperty) { 
    if (aBase.getClass().getCanonicalName().equals("com.sun.faces.el.CompositeComponentAttributesELResolver.ExpressionEvalMap")){ 
     Object tempProperty=((Map)aBase).get(aProperty); 
     if (tempProperty!=null&&tempProperty.getClass().getCanonicalName().equals("org.apache.openjpa.util.java.util.Date.proxy")) { 
      anElContext.setPropertyResolved(true); 
      return java.util.Date.class; 
     } 
    } 
    return null; 
} 


} 

將它添加到faces-配置是這樣的:

<el-resolver> 
    xxx.BugfixELResolver 
</el-resolver> 

這種解決方法也可以用於不能更改EL實現的環境(如websphere等)。

+0

好的解決方法的想法修復。然而它在新的webpshere版本中解決了。我會將您的解決方案標記爲已接受 – jonnie119 2012-02-10 09:22:42

1

以下是解決方法。這個問題似乎是WebSpheres的ExpressionLanguage實現,或者是命令解析器被執行。註冊JBoss EL實現並在調用複合組件之前解析日期代理。我也嘗試了Glassfish的EL,但它也不能工作......

註冊一個替代EL是很奇怪:用於MyFaces的web.xml中設置爲

<context-param> 
    <param-name>org.apache.myfaces.EXPRESSION_FACTORY</param-name> 
    <param-value>org.jboss.el.ExpressionFactoryImpl</param-value> 
</context-param> 

此外WebContent/META-INF/services/文件下該單行org.jboss.el.ExpressionFactoryImpl需要命名爲javax.el.expressionFactory。類來自jboss-el-2.0.2.CR1.jar (對不起,找不到鏈接到一個Maven回購)

我會繼續當我找到一個更好的解決方案,您更新中...

+0

更新:它原來是Websphere的一個問題,它的目標是用8.0.0.2 – jonnie119 2011-08-08 20:49:19