3

我有以下构造:

@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 框架中的错误或我这边的一些愚蠢的错误?

谢谢解答!!!

4

2 回答 2

2

这看起来与您在尝试将方法绑定传递到 Facelets 标记时遇到的错误非常相似。

由于 Facelets 中的一些尴尬的设计错误,这永远不会起作用(仅与异常值有关)。

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

也许这对您的情况也有帮助。

更新:

一个名为 OmniFaces 的新实用程序库有一个帮助标记,让您可以使用方法表达式而无需上述分解,请查找methodParam

于 2011-09-02T08:33:15.663 回答
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" />
于 2013-03-06T01:27:54.617 回答