在运行时为selectOneMenu创建一个转换器



所以我需要创建一个动态的屏幕,并提供关于具有未知数量参数的对象的信息,各种类型(可以是文本,可以是日期,以及导致问题的东西),可以是要从SelectOneMenu中选择的项,其绑定(如"#{myBean。list}"和converter(如"#{somethingConverter})是参数的字段。

因此,要创建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);
}

但是我必须将Converter设置为菜单,并且我不能使用相同的方法,因为不可能实例化Converter,所以我不能仅将其设置为表达式。

我尝试使用反射,它几乎有效,但在我的转换器中,一些管理器是使用

创建的
    @Inject
    private SomeManager mManager;

如果我使用反射创建一个转换器,那些管理器不会被创建,当我使用它们时,我最终会得到一个NullPointerException。

所以有一种方法,我可以动态地创建一个转换器使用表达式,我将把"converter="在我的XHtml页面后?或者,使用反射来强制我的转换器类进行"注入"实例化?

感谢您的帮助

我尝试使用反射,它几乎有效,但在我的转换器中,一些管理器是使用

创建的
@Inject
private SomeManager mManager;

如果我使用反射创建一个转换器,这些管理器不会被创建,当我使用它们时,我最终会得到一个NullPointerException

换句话说,您的转换器是托管bean(例如@Named@ManagedBean),而不是面向转换器(例如@FacesConverter<converter>)?在这种情况下,您需要通过编程方式计算引用它的EL表达式来创建它们,如下所示

Converter converter = context.getApplication().evaluateExpressionGet(context, "#{someConverter}", Converter.class);

相关内容

最新更新