2012-05-08 10 views
5

次の問題を抱えているJSFの専門家の助けが必要です。 特定のクラスのfaces-config.xmlにいくつかのコンバーターを定義しましたが、コンバータ属性またはタグを常に使用すること。たとえば、次のようにManagedBean(JSF 1.2)のクラスのJSF Converterを取得する

<converter> 
     <converter-for-class>org.joda.time.DateTime</converter-for-class> 
     <converter-class>com.example.converter.JodaDateTimeConverter</converter-class> 
    </converter> 

今JSFコンポーネント(主に豊富:extendedDataTable)のためのクローラが必要とされている全コンポーネントツリーを構築し、CSVにレベルの後にレベルを変換し、HTMLまたは何でも、後で必要になる場合がありますに。つまり、CSV、HTMLなどにエクスポートする一般的な方法です。毎回毎回実装する必要はありません。それはほとんど(私の昔の同僚の素晴らしいアイデアのおかげで)行われ、それが一部を除いて素晴らしい仕事ん:outputTextのと文字列に変換します。コマンド

Object expressionResult = expression.getValue(FacesContext.getCurrentInstance().getELContext()); 
    expressionResultString = expressionResult.toString(); 

は、hの値を取得します。最後の行は、特定のexpressionResultのカスタムコンバータがある場合、converter-for-classで置き換えたいものです。自分のクラスの正確なコンバータを(faces-configで指定されているように)見つける方法を見つけることができません。 FacesContextは、私のユースケースに対して有用なメソッド/オブジェクトを保持しているようには見えません。 faces-config.xmlに直接アクセスするのは間違っているようです。

Converter converter = magically_fetch_the_correct_converter_for_expressionResult_type; 
    converter.getAsString(FacesContext.getCurrentInstance(), component, 
           expressionResult); 

私はコンポーネント自身のためにコンバータ-idと適切な属性/タグを使用しますが、私は本当に役に立たない追加のコードのようなものを避けたい場合にはかなり簡単だろう:正しいアプローチは、次のようになります。

誰かが私を助けてくれますか?

答えて

8

あなたはApplication#createConverter()を探しています。

Object object = expression.getValue(context.getELContext()); 
Class<?> type = expression.getType(context.getELContext()); 
Converter converter = context.getApplication().createConverter(type); 
String string = converter.getAsString(context, component, object); 
+0

ありがとうございました!それはまさに私が探していたものでした:)私は、JSFクラスに便利なJavaDocがあったことを願っています。それは確かに私の人生をもっと楽にしてくれるだろう。 –

+0

javadocへの私の答えのリンクのテキスト 'Application#createConverter()'。 – BalusC

関連する問題