5

私は立ち往生しており、次の問題でJSFの専門家からの外部の助けが必要です:特定のクラスのfaces-config.xmlでいくつかのコンバーターを定義したので、常にconverter-attributeまたはtagを使用する必要はありません。例えば:

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

ここで、JSFコンポーネント(主にrich:extendedDataTable)のクローラーが必要です。これは、コンポーネントツリー全体を構築し、レベルごとにCSV、HTML、または後で必要になる可能性のあるものに変換します。つまり、CSV、HTMLなどにエクスポートする一般的な方法であり、毎回新たに実装する必要はありません。それはほぼ完了しており(私の古い同僚の素晴らしいアイデアのおかげで)、一部を除いてうまく機能します:

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

このコマンドは、h:outputTextの値を取得し、それをStringに変換します。その最後の行は、特定のexpressionResultのカスタムコンバーターがある場合に、クラス用コンバーターに置き換えたいものです。(faces-configで指定されているように)クラスの正確なコンバーターを見つける方法がわかりません。FacesContextは、私のユースケースに役立つメソッド/オブジェクトを保持していないようです。faces-config.xmlに直接アクセスするのはちょっと間違っているようです。正しいアプローチは次のようになります。

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

コンバーターIDとコンポーネント自体に適切な属性/タグを使用すればかなり簡単ですが、そのような無駄な追加コードは避けたいと思います。

誰か助けてくれませんか?

4

1 に答える 1

9

あなたが探して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);
于 2012-05-09T13:02:44.867 に答える