2011-05-30 9 views
1

私はJSFからJPA管理する日付値にアクセスし、それは(JPA-管理する日付値を使用して日付変換例外が

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

を言っjavax.faces.component.UdateModelExceptionに戻ってきましたそれはELから直接使用する場合は正常に動作します)、それがプロキシされることを意味することは、これを好き:

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

しかし、それは複合コンポーネントで をそれを使用しようとすると、トラブルの原因となり、次のコンバータの例外をバック与え、これができモデルを更新する...

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> 

仮定(簡略化)JSF複合コンポーネント: それ値は複合内部からアクセスされているときのOpenJPAのプロキシ交換が別の方法で処理されると思われます。私の推測では、ELリゾルバは、コンポジットに渡されるときにオブジェクト値への呼び出しを別々に処理します。コンポジットに渡すことは、コンポジット内で最初にアクセスされたことを意味します。これは遅すぎるため、プロキシの必要な置換が行われません(コンバーターの例外)。

MyFacesの表現言語を変更しようとしましたが、最後にクラスローディングを親に変更し、libフォルダのglassfishからel-implとel-apiを提供し、MyFacesに必要なコンテキストパラメタを挿入したにもかかわらず、Websphereでは動作しませんでした

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

+0

コンポジットコンポーネントを使用していないときに動作することを暗示しているようです(したがって、コンポーネントをページの「通常の方法」で直接使用する場合)。これは本当ですか? – BalusC

+0

@BalusC右。それを "直接"使用すると、期待どおりに動作します。私はMyFaces Resolverがhttps://cwiki.apache.org/MYFACES/elresolver-ordering.htmlでソートされていることを発見しました。別のELFactoryImpl(JBoss El 2.0.1)を使用すると、JPAのプロキシされた日付のトリックは、WebSphere 8に登録するのは面倒ですが、メソッド呼び出しはそのelでもう機能しません。 – jonnie119

+0

前にこの問題を見ましたが、MyFacesも使用していません。あなたはMyFacesの代わりにMojarraを試す機会がありますか?ただそれを除外することですが。 – BalusC

答えて

1

...私はよりよい解決策を見つけたら、私はあなたが最新の状態に保つでしょうjboss-el-2.0.2.CR1.jar (申し訳ありませんが、Mavenのレポへのリンクを見つけることができませんでした)

から来ていますあなたはこの問題を回避します次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; 
} 


} 

顔-config設定には、この方法でそれを追加します。

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

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

+0

素晴らしい回避策のアイディアです。しかし、それは新しいwebpshereのバージョンで解決されます。私はあなたの解決策を受け入れたものとしてマークします – jonnie119

1

これは回避策です。この問題は、WebSpheresのExpressionLanguage実装のようであるか、オーダーリゾルバが実行されているようです。 JBoss EL実装を登録すると、複合コンポーネントを呼び出す前に日付プロキシが解決されます。 MyFacesのためのweb.xmlの設定が

WebContent/META-INF/services/下にさらに
<context-param> 
    <param-name>org.apache.myfaces.EXPRESSION_FACTORY</param-name> 
    <param-value>org.jboss.el.ExpressionFactoryImpl</param-value> 
</context-param> 

ファイルです:ELは非常に奇妙である、代替の登録

を私はまた、GlassfishのELを試してみましたが、それはうまくいきませんでしたどちらか...この単一の行でjavax.el.expressionFactoryという名前が必要ですorg.jboss.el.ExpressionFactoryImpl。あなたは太陽ELの実装を使用している場合、クラスは

+0

アップデート:バージョン8.0.0.2で修正されることを目標としているWebsphereでは、el-issueであることが判明しました – jonnie119