在运行时为selectOneMenu创建转换器

时间:2013-05-16 17:41:00

标签: java jsf

所以我需要创建一个动态的屏幕,并提供有关各种类型参数数量未知的对象的信息(可能是texte,可能是日期,导致问题的东西,可能是一个项目到从SelectOneMenu中选择,其绑定(如“#{myBean.list}”和转换器(如“#{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);
}

但是我必须将转换器设置为菜单,并且我不能使用相同的方法,因为它无法实例化转换器,因此我无法将其设置为表达式。

我尝试使用反射,它几乎可以工作,但在我的转换器中,一些管理器是使用

创建的
    @Inject
    private SomeManager mManager;

如果我使用反射创建转换器,则不会创建这些管理器,并且在使用它时最终会出现NullPointerException。

那么有没有办法可以使用我在XHtml页面中的“converter =”之后放置的表达式动态创建转换器? 或者,使用反射,强制我的转换器类进行“注入”实例化?

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

  

我尝试使用反射,它几乎可以工作,但在我的转换器中,一些管理器是使用创建的

@Inject
private SomeManager mManager;
     

如果我使用反射创建转换器,则不会创建这些管理器,并且在我使用它时最终会得到NullPointerException。

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

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