JSF Combine ui:param with composite component

这一生的挚爱 提交于 2019-12-06 05:50:40

问题


you have saved me many times ago with this forum, but now I am really stuck and don't now where to search any longer...

I always get the following error message (warning level, but method is also not executed correctly):

javax.el.PropertyNotFoundException: Target Unreachable, identifier 'editor' resolved to null: javax.faces.FacesException: #{cc.attrs.selectionListener}

I have isolated the problem to a few lines of code:

This is my main file:

<c:forEach items="#{myBean.getEditors()}" var="currentEditor" >
    <ui:include src="#{currentEditor.getPanel()} >
        <ui:param name="editor" value="#{currentEditor} />
    </ui:include>
</c:forEach>

The bean.getEditors() (session scoped) just returns a list with one single entry at the moment. The 'editor' is a POJO with some simple attributes and two listener methods. The listener method does only write a log entry. (Should of course do more in future)

The file which is included looks like this:

<h:selectOneMenu value="#{editor.menuValue}>
    <f:selectItem itemValue="Value 1" />
    <f:selectItem itemValue="Value 2" />
    <a4j:ajax event="change" listener="#{editor.menutListener()}" />
</h:selectOneMenu>
<myComponent:treeComponent id="tree" selectionListener="#{editor.treeListener()} />

The component I created consists of a richfaces tree and when clicking on a node the following method is called:

<a4j:jsFunction name="performSelection" action="#{cc.attrs.selectionListener} />

I am quite confident that the composition itself is ok because I use it also at different places. When I remove the action from the a4j:jsFunction it also works perfect.

For me it smells a bit like the bug JSF 1223

The workaround does not work for me - probably because I create the param in the forEach.

I had similar problems (ui:param + component) before, but was able to solve them with giving the full path as attribute instead of a parameter. But this does not work here because it is used in too many different places.

Please help, I cannot be the only one with this problem, but I simply do not find any other threads for this.

Edit:

Today with a fresh mind I came even closer to the problem. You can forget the whole include/ forEach stuff...

<myComponent:treeComponent id="tree" selectionListener="#{myBean.getSingleEditor().treeListener()} />

Does work, while

<ui:param name="editor" value="#{myBean.getSingleEditor()} />
<myComponent:treeComponent id="tree" selectionListener="#{editor.treeListener()} />

does not work. Well the JAVA code is performed, but the error is written to the log and the render and oncomplete method of the jsFunction do not work. I also tried to use "data" instead of "action" for testing. No error is written to log, but JAVA method is not even called.


回答1:


After many days of try&error I found a solution that is working for me:

I splitted up the listener method to one parameter with the JAVA class and one parameter with the the method name (as simple String)

The action method now looks like:

<a4j:jsFunction name="performSelection" action="#{cc.attrs.listenerClass[cc.attrs.listenerMethodName]}" />

Not nice but working... Perhaps it helps someone - or anybody can explain more...

By the way, the following was not working for me:

<a4j:jsFunction name="performSelection" action="#{cc.attrs.listenerClass[staticMethodName]}" />

While this was ok...

<a4j:jsFunction name="performSelection" action="#{cc.attrs.listenerClass.staticMethodName()}" />

Don't know - perhaps my head is running agains the same wall again and again...



来源:https://stackoverflow.com/questions/25142072/jsf-combine-uiparam-with-composite-component

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!