Inheritance 使用seam 3和JSF2组合组件valueChangeListener评估El表达式时出现问题

Inheritance 使用seam 3和JSF2组合组件valueChangeListener评估El表达式时出现问题,inheritance,jsf-2,composite-component,seam3,valuechangelistener,Inheritance,Jsf 2,Composite Component,Seam3,Valuechangelistener,我有以下想法: @Named public class SpecificAction extends BasicAction { public void calulateSomething(ValueChangeEvent event) {...} } } @Named public abstract class BasicAction { public void calculateSomething(ValueChangeEvent event) {...} }

我有以下想法:

@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>
你知道那是什么吗
Seam 3或JSF2框架中的Bug或我这边的stubid错误?


谢谢你的回答 这与尝试将方法绑定传递到Facelets标记时遇到的错误完全相同

由于Facelets中存在一些笨拙的设计错误,这永远不会起作用(这与例外值有关)

解决方案是将bean和方法名作为单独的属性传递。然后最终使用数组样式寻址将它们组合起来:bean[methodName]

也许这对你的情况也有帮助

更新:


一个名为OmniFaces的新实用程序库有一个helper标记,让您使用方法表达式而不必进行上述分解,查找methodParam

我在将EL表达式解析为属性而不是方法时遇到了相同的问题,但仅适用于Mojarra 2.1.6上的非托管bean(@BalusC可能没有遇到这种情况,因为使用了托管bean)

通过分别传递bean和方法解决,如Mike所述:

<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" />


我无法在Mojarra 2.1.2上重现您的问题。您使用的是什么JSF impl/版本?它可能已在较新版本中修复。请注意,我没有使用CDI注释,只是使用JSF注释,但这不会有任何区别。嘿,BalusC,感谢您的测试,我在Mojarra 2.1.3-FCS(beta 3)上进行了尝试问题仍然存在。我将在没有seam 3的其他情况下尝试它。我不能临时标记concret EL验证接口EIMPL,它可能是JSF,我仍在使用CDI,但不在此上下文中。另一个问题是,您是否使用视图范围的bean(基本和特定操作)来尝试它?非常感谢!我确实使用了视图范围的bean,但是范围应该无关紧要。这是一个EL错误。我在Tomcat7(Servlet 3.0/EL 2.2)上进行了测试顺便说一句,我不确定CDI是否允许它,但是抽象类上的
@Named
对我来说毫无意义,因为它是不可构造的。我使用它只是为了在jboss xhtml编辑器上完成代码,它会在java.P.s上被识别。谢谢!好吧,顺便说一句,我试过了。我必须使用被黑客攻击的jboss 6。我知道这不是一个完美的环境t、 谢谢你的建议,我会在我给定的系统上尝试,如果这是一个可管理的解决方案,我会发布我的解决方案。好的,我很好奇最终的解决方案是什么。你得到的错误绝对是由EL表达式被解释为值表达式而它应该被解释为方法表达式引起的,
[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]
<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" />