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}"/> 

ただし、複合コンポーネントで使用しようとすると問題が発生し、次のコンバーター例外が返され、モデルを更新できません...

(簡略化された) 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 の Expression Language を変更しようとしましたが、クラスのロードを最後に親に変更し、lib フォルダーに Glassfish から el-impl と el-api を提供し、必要なコンテキストを挿入したにもかかわらず、Websphere では機能しませんでした。 -MyFaces のパラメータ

複合コンポーネントでJPA管理の日付(または他のプロキシされたエンティティ)をどのように使用しますか???

4

2 に答える 2

1

回避策は次のとおりです。問題は、WebSphereの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>

さらに、この1行でWebContent/META-INF/services/という名前のファイルjavax.el.expressionFactoryが必要ですorg.jboss.el.ExpressionFactoryImpl。クラスの由来jboss-el-2.0.2.CR1.jar (申し訳ありませんが、Mavenリポジトリへのリンクが見つかりませんでした)

より良い解決策が見つかったら、最新情報をお知らせします...

于 2011-05-31T15:32:58.687 に答える
1

Sun 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-config に追加します。

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

この回避策は、EL 実装を変更できない環境 (websphere など) でも使用できます。

于 2012-01-25T14:29:11.000 に答える