Их нужно создать и добавить следующим образом (скопировано из одного из моих предыдущих ответов ):
FacesContext context = FacesContext.getCurrentInstance();
MethodExpression actionListener = context.getApplication().getExpressionFactory()
.createMethodExpression(context.getELContext(), "#{bean.actionListener}", null, new Class[] {ActionEvent.class});
uiCommandComponent.addActionListener(new MethodExpressionActionListener(actionListener));
... где #{bean.actionListener}
действительно существует и объявляется следующим образом в классе базового компонента, связанном с именем управляемого компонента bean
:
public void actionListener(ActionEvent event) {
// ...
}
Что более важно, вам нужно дать любому динамически созданному UICommand
(и UIInput
) рассматриваемому компоненту также фиксированный идентификатор, иначе он получит автоматически сгенерированный идентификатор, который может привести к тому, что JSF не сможет найдите / сопоставьте его на этапе применения значений запроса.
Таким образом, сделайте так же:
uiCommandComponent.setId("someFixedId");