0

そのため、動的で、さまざまなタイプの不明な数のパラメーターを持つオブジェクトに関する情報を提供する画面を作成する必要があります (テキスト、日付、問題の原因となるもの、バインディング (「#{myBean.list}」など) とコンバーター (「#{somethingConverter}」など) がパラメーターのフィールドである SelectOneMenu。

したがって、SelectOneMenu を作成するには、次のようなものを用意しました。

    SelectOneMenu menu = new SelectOneMenu();
    UISelectItems items = new UISelectItems();

    ValueExpression expr = getValueExpression(param.binding); //param.binding is a String containing the expression
    items.setValueExpression("value", expr);

    menu.getChildren().add(items);
    panel.getChildren().add(menu);
}


private ValueExpression getValueExpression(String expression) {
    ExpressionFactory expressionFactory = FacesContext.getCurrentInstance().getApplication().getExpressionFactory();
    ELContext expressionContext = FacesContext.getCurrentInstance().getELContext();
    return expressionFactory.createValueExpression(expressionContext, expression, Object.class);
}

しかし、コンバーターをメニューに設定する必要があり、コンバーターをインスタンス化することは不可能であるため、同じ方法を使用できないため、式を設定することはできません。

リフレクションを使用してみましたが、ほとんど機能しますが、私の Converters では、いくつかのマネージャーが使用して作成されています

    @Inject
    private SomeManager mManager;

また、リフレクションを使用してコンバーターを作成すると、それらのマネージャーは作成されず、それらを使用すると NullPointerException が発生します。

XHtml ページの "converter=" の後に置く式を使用してコンバーターを動的に作成する方法はありますか? または、リフレクションを使用して、コンバーター クラスに「注入」インスタンス化を強制するには?

お手伝いありがとうございます !

4

1 に答える 1

0

リフレクションを使用してみましたが、ほとんど機能しますが、私の Converters では、いくつかのマネージャーが使用して作成されています

@Inject
private SomeManager mManager;

また、リフレクションを使用してコンバーターを作成すると、それらのマネージャーは作成されず、それらを使用すると NullPointerException が発生します。

言い換えれば、あなたのコンバーターは管理された Bean (例えば@Namedまたは@ManagedBean) であり、フェイス コンバーター (例えば@FacesConverterまたは) ではありません<converter>か? その場合、次のように参照するEL式をプログラムで評価して作成する必要があります

Converter converter = context.getApplication().evaluateExpressionGet(context, "#{someConverter}", Converter.class);
于 2013-05-17T11:56:47.700 に答える