Добавление составного компонента программно

#jsf #composite-component #omnifaces

#jsf #составной компонент #omnifaces

Вопрос:

Я хотел бы включить ниже составной компонент программно:

 <composite:interface>
    <composite:attribute name="sampleBean" />
    <composite:attribute name="autoCompleteMethod"
        method-signature="java.util.List autoCompleteMethod(java.lang.String)" />
</composite:interface>
  

В Omnifaces есть функция:

 // Programmatically include composite component.
Components.includeCompositeComponent(someParentComponent, libraryName, resourceName, id);
  

Однако мне непонятно, как указать autoCompleteMethod в полученном экземпляре UIComponent. Как я могу этого добиться?

Ответ №1:

includeCompositeComponent() Возвращает UIComponent экземпляр, представляющий составную реализацию.

 UIComponent composite = Components.includeCompositeComponent(someParentComponent, libraryName, resourceName, id);
  

Все его атрибуты доступны как Map by UIComponent#getAttributes() .

 Map<String, Object> attributes = composite.getAttributes();
  

Вы можете использовать Components#createMethodExpression() для создания выражения метода EL. Предполагая, что вы собираетесь указать #{bean.complete} , вот пример:

 MethodExpression autoCompleteMethod = Components.createMethodExpression("#{bean.complete}", List.class, String.class);
  

Теперь просто установите его как атрибут!

 attributes.put("autoCompleteMethod", autoCompleteMethod);