我有以下构造:
@Named
public class SpecificAction extends BasicAction {
public void calulateSomething(ValueChangeEvent event) {...}
}
}
@Named
public abstract class BasicAction {
public void calculateSomething(ValueChangeEvent event) {...}
}
比观点:
文件:SpecificAction.xhtml
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:p="http://primefaces.prime.com.tr/ui"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:cc="http://java.sun.com/jsf/composite/cc"
xml:lang="de" lang="de">
<ui:composition template="/BasicAction.xhtml">
<ui:param name="basicAction" value="#{specificAction}" />
....
</ui:composition>
BasicAction.xhtml包含我的复合组件:
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:p="http://primefaces.prime.com.tr/ui"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:cc="http://java.sun.com/jsf/composite/cc"
xmlns:gui="http://java.sun.com/jsf/composite/gui">
<gui:inplaceInput id="name" valueChangeListener="#{basicAction.calculateSomething}" value=#{bean.name} />
</html>
复合组件:
<composite:interface>
<composite:attribute name="value" />
<composite:editableValueHolder name="Value"/>
<composite:attribute name="valueChangeListener" targets="Value" />
</composite:interface>
<composite:implementation>
<h:inputText id="Value" value="#{cc.attrs.value}" onblur="handleBlur(this.id);" >
<composite:insertChildren />
</h:inputText>
</composite:implementation>
如果我运行我的创建,如果valueChangeListener的el是“specificAction”,它将完美地工作。它也可以在带有“basicAction”表达式的basicAction.xhml中正常工作,只是复合组件我得到了有趣的异常:
[ExceptionHandlerFactory] Handling exception javax.faces.event.AbortProcessingException: javax.faces.event.AbortProcessingException: /BasicAction.xhtml @XX,XX valueChangeListener="#{basicAction.calculateSomething}": The class 'SpecificAction' does not have the property 'calculateSomething'.
at javax.faces.event.MethodExpressionValueChangeListener.processValueChange(MethodExpressionValueChangeListener.java:157) [:2.1.3-FCS]
at javax.faces.event.ValueChangeEvent.processListener(ValueChangeEvent.java:134) [:2.1.3-FCS]
at javax.faces.component.UIComponentBase.broadcast(UIComponentBase.java:769) [:2.1.3-FCS]
任何想法,黑客可能是什么?
Seam 3或JSF2 Framework中的错误或我身上的一些顽固错误?
答案 0 :(得分:2)
这看起来与尝试将方法绑定传递给Facelets标记时出现的错误类似。
由于Facelets中的一些尴尬的设计错误,这种情况永远不会起作用(仅与除了值之外的情况有关)。
解决方案是将bean和方法的名称作为单独的属性传递。然后使用数组样式寻址最终组合它们:bean [methodName]。
也许这对你的情况也有帮助。
的更新强> 的
一个名为OmniFaces的新实用程序库有一个帮助器标记,让您在没有上述分解的情况下使用方法表达式,查找 methodParam 。
答案 1 :(得分:1)
我有同样的问题,EL表达式解析为属性而不是方法,但仅适用于Mojarra 2.1.6上的非托管bean (@BalusC可能因为使用而未遇到此问题托管bean)。
通过像Mike提到的那样单独传递bean和方法来解决:
<composite:attribute name="valueChangeBean" required="true" />
<composite:attribute name="valueChangeMethod" required="true" />
...
<composite:implementation>
<h:selectBooleanCheckbox
valueChangeListener="#{cc.attrs.valueChangeBean[cc.attrs.valueChangeMethod]}"
value="#{cc.attrs.isValue}"/>
使用页面:
<name:custom value="#{bean.val}"
valueChangeBean="#{bean}"
valueChangeMethod="onValChange" />