Чего я хотел бы добиться, так это иметь возможность обращаться к некоторым компонентам JSF из другого контейнера именования.
Usecase: составной компонент, который инкапсулирует некоторые функции, используя - для поля, определенного вне составного компонента.
Какой-то код:
<form id="foo">
...
<label for="nameTxt">Name:</label>
<component:customError forField="nameTxt" />
<h:inputText id="nameTxt" />
...
</form>
и компонент:
<composite:implementation>
<h:panelGroup id="errorComponent">
...
<h:message for="#{cc.attrs.forField}" id="errorMsg" style="display:none;" />
...
</h:panelGroup>
</composite:implementation>
Проблема в том, что при рендеринге сообщения я получаю:
Could not render Message. Unable to find component 'nameTxt' (calling findComponent on component 'j_id963445801_469fc056:errorMsg')
Мне кажется, я понимаю, что проблема заключается в том, что поле "nameTxt" и сообщение "errorMsg" лежат в других контейнерах имен. Поэтому я хотел бы указать путь / идентификатор "nameTxt" по отношению к некоторому общему предку.
После краткого изучения алгоритма UIComponentBase: findComponent На самом деле я не вижу другого способа адресации кросс-контейнеров именования, кроме указания целого (абсолютного) id-пути из корня (то есть ": foo: ...: nameTxt "). И это неуклюже и может привести к ошибкам после изменения структуры страницы.
Итак - как правильно обратиться к полю "nameTxt" из сообщения в составном компоненте?