结合接缝 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 表达式的问题的主要内容,如果未能解决你的问题,请参考以下文章