结合接缝 3 和 JSF2 复合组件 valueChangeListener 评估 El 表达式的问题

Posted

技术标签:

【中文标题】结合接缝 3 和 JSF2 复合组件 valueChangeListener 评估 El 表达式的问题【英文标题】:Problem with evaluating El expressionin combination with seam 3 and JSF2 composite component valueChangeListener 【发布时间】:2011-11-08 15:08:08 【问题描述】:

我有以下构造:

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

感谢解答!!!

【问题讨论】:

我无法在 Mojarra 2.1.2 上重现您的问题。您使用的是什么 JSF impl/version?它可能已在较新的版本中得到修复。请注意,我没有使用 CDI 注释,只使用 JSF 注释,但这不应该有任何区别。 嘿 BalusC,感谢您的测试,我用 Mojarra 2.1.3-FCS (beta 3) 进行了尝试,但问题仍然存在。我将在没有接缝 3 的其他情况下尝试它。我无法暂时标记具体的 EL-Validation InterfaceImpl,它可能是 JSF,我仍在使用 CDI,但不在此范围内。另一个问题是,您是否或可以尝试使用视图范围的 bean(Basic- 和 SpecificAction)?非常感谢! 我确实使用了视图范围的 bean,但范围无关紧要。这是一个 EL 错误。我在 Tomcat 7 (Servlet 3.0 / EL 2.2) 上进行了测试。顺便说一句,我不确定它是否在 CDI 中被允许,但是抽象类上的 @Named 对我来说毫无意义,因为它无论如何都不可构造。 我只是在 jboss-xhtml 编辑器上用它来编译代码,它在 java 上被识别了。附:谢谢!好的,顺便说一句,我试过了。我必须使用被黑的 jboss 6。我知道这不是完美的环境。 【参考方案1】:

这看起来与尝试将方法绑定传递到 Facelets 标记时遇到的错误完全一样。

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

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

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

更新:

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

【讨论】:

感谢您的建议,我会在我给定的系统上尝试这个,如果它是一个可管理的解决方案,我会发布我的解决方法。 好的,我很好奇最终的解决方案是什么。你得到的错误绝对是由 EL 表达式被解释为 value 表达式 而它应该被解释为 method expression,【参考方案2】:

我在将 EL 表达式解析为属性而不是方法时遇到了同样的问题,但仅适用于 Mojarra 2.1.6 上的 unmanaged beans (@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" />

【讨论】:

以上是关于结合接缝 3 和 JSF2 复合组件 valueChangeListener 评估 El 表达式的问题的主要内容,如果未能解决你的问题,请参考以下文章

JSF2.0 - 具有可选方法表达式的复合组件

jsf 2.0 自定义组件/标签不复合

JSF 2 - 如何将 Ajax 侦听器方法添加到复合组件接口?

如何在 JSF 2 中以编程方式或动态创建复合组件

JSF 2 复合组件渲染问题

JSF 2.0 复合组件 - ajax 渲染参数 OUTSIDE 组件定义