所以我需要创建一个动态的屏幕,并提供有关具有未知数量的参数的对象的信息,各种类型(可能是文本,可能是日期,并且,导致问题的东西,可能是一个可供选择的项目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);
}
但是我必须在菜单中设置一个转换器,并且我不能使用相同的方法,因为不可能实例化一个转换器,所以我不能将它设置为一个表达式。
我尝试使用反射,它几乎可以工作,但是在我的 Converters 中,一些管理器是使用创建的
@Inject
private SomeManager mManager;
如果我使用反射创建转换器,则不会创建这些管理器,并且在使用它们时最终会得到 NullPointerException。
那么有没有一种方法可以使用我在 XHtml 页面中“converter=”之后放置的表达式来动态创建转换器?或者,使用反射来强制我的转换器类进行“注入”实例化?
感谢您的帮助 !