Это сводит меня с ума, потому что я делал это раньше без проблем.Я пытаюсь передать метод компоненту, но в итоге получаю NULL.
У меня есть следующий компонент:
<?xml version="1.0" encoding="UTF-8"?>
<ui:component
xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
xmlns:cc="http://xmlns.jcp.org/jsf/composite"
xmlns:f="http://xmlns.jcp.org/jsf/core"
>
<cc:interface name="commentsAndDocumentsTemp" displayName="commentsAndDocumentsTemp">
<cc:attribute name="value" required="true" type="com.my.company.common.component.cmntAndDocs.ICommentsAndDocumentsCV" />
<cc:attribute name="commentSaveRender" required="false" type="java.lang.Boolean" default="false" />
<cc:attribute name="commentSaveMethod" required="false" method-signature="java.lang.Void save()"/>
</cc:interface>
<cc:implementation>
<ui:fragment rendered="#{cc.rendered}">
<f:event type="javax.faces.event.PreRenderComponentEvent" listener="#{cc.attrs.value.checkMethod(cc.attrs.commentSaveRender, (empty cc.getValueExpression('commentSaveMethod')))}" />
#{empty cc.getValueExpression('commentSaveMethod')}<br/>
</ui:fragment>
</cc:implementation>
</ui:component>
Он находится внутри стандартной страницы XHTML, например:
<tceq_comptest:commentsAndDocumentsTemp
value="#{testCommentsAndDocsCntlr.cadCV}"
commentSaveRender="true"
commentSaveMethod="#{testCommentsAndDocsCntlr.genericListener()}"
/>
Я также попробовал метод, подобный этому:
commentSaveMethod="#{testCommentsAndDocsCntlr.genericListener}"
Контроллер имеет этот метод:
public void genericListener() {
System.out.println("Hello");
}
И объект атрибута значения имеет этот метод:
public void checkMethod(Boolean saveRender, Boolean emptyMethod) {
if (saveRender && emptyMethod) {
System.out.println(emptyMethod);
}
}
printLn в методе объекта значения записывает значение «true» в журнал, а выходные данные компонента записывают значение «true» на экран, указывая, что атрибут для сигнатуры метода равенпусто.
Я упускаю что-то очень простое, я уверен, но я в тупике.