2015-08-25 3 views
2

Я пишу составной компонент, который содержит <h:selectManyMenu>, и я хотел бы, чтобы клиенты этого компонента поставить валидатор и конвертеры путем размещения <f:validator> и <f:converter> тегов, как дети тега моего составного компонента. В интерфейсной секции моего композита я имеюJSF 2.2 Композитные Компонентный EditableValueHolder

<composite:editableValueHolder name="select-input" targets="select-many" /> 

и в секции реализации:

<h:selectManyMenu id="select-many" styleClass="hidden select-input" value="#{cc.attrs['value']}" binding="#{cc.inputComponent}"> 
    <composite:insertChildren /> 
</h:selectManyMenu> 

и, наконец, использование:

<cwi:selectManyMenu id="select-many-menu" value="#{selectManyBean.selectedItems}"> 
    <f:converter converterId="converter.testItem" for="select-many" /> 
    <f:validator validatorId="validator.testItem" for="select-input" /> 
    <f:selectItems value="#{selectManyBean.possibleItems}" var="item" itemValue="#{item}" itemLabel="#{item.description}" /> 
</cwi:selectManyMenu> 

Проблема называются ни валидатор, ни преобразователь. У меня также есть классы валидатора и конвертера, каждый из которых аннотируется @FacesValidator('validator.testItem') и @FacesConverter("converter.testItem") соответственно. Они правильно подбираются, потому что, если я перемещаю теги и <f:converter> внутри составного компонента, под <composite:insertChildren> все работает нормально, но я бы лучше разоблачил их для клиентов, чем их жесткий код. Есть ли что-то о том, как insertChildren работает при использовании editableValueHolder? Чтобы получить эту работу, я мог бы просто сделать идентификатор конвертера и идентификатора проверки частью интерфейса, но это теряет некоторую гибкость для передачи атрибутов преобразователям и валидаторам.

+0

Какой тип/версия JSF? После того, как я установил «очевидную» опечатку в '' к значению, которое вы уже получили в '', оно отлично работает для меня на Mojarra 2.2.12. – BalusC

ответ

2

Я использую Mojarra 2.2.8-jbossorg-1. Помимо очевидной опечатки, я должен был включить больше xhtml моего составного компонента. Я использовал компонент поддержки, и без компонента поддержки все работало нормально, как только я исправил опечатку, но когда я добавил компонент backing, валидатор и конвертер перестали работать.

После просмотра страницы вики здесь для составных компонентов https://stackoverflow.com/tags/composite-component/info Я понимаю, что компоненты подложки для составных компонентов не совпадают с классами для пользовательских компонентов. Для составных компонентов они всегда должны просто расширять UINamingContainer. Моя ошибка, специально для этого selectManyMenu, заключалась в том, что мой компонент поддержки расширяет UISelectMany.

+0

Вы можете расширить 'UISelectMany' и реализовать' NamingContainer' и переопределить 'getFamily()' для возврата 'UINamingContainer.COMPONENT_FAMILY'. – BalusC

Смежные вопросы