我们在JSF 2.2项目中有一个像这样使用的复合组件(为了清晰起见,代码已经过简化):
<!-- the page with the composite component inside -->
<my:component methodListener="#{myBean.myMethod}" />
<!-- the composite component -->
<cc:interface>
<cc:attribute name="methodListener" required="true" method-signature="void listener(javax.faces.event.AjaxBehaviorEvent)" />
...
<cc:implementation>
<h:commandLink>
<f:ajax listener="#{cc.attrs.methodListener}" />
<f:attribute name="myAttribute" value="myValue" />
</h:commandLink>
// the called method
public void myMethod(AjaxBehaviorEvent event)
{
System.out.println("> " + event);
}
在Wildfly 9.0.2中,单击复合组件内的commandLink
时,会调用myMethod
并定义事件(允许我们找回myAttribute
值)。< / p>
在Wildfly 10.1.0中,使用完全相同的代码,会调用myMethod
,但事件参数始终为null
。
我们在这里做错了吗?
经过测试的解决方法可能是使用bean实例替换methodListener CC属性,类似于以下代码。不过,这需要在我们的项目中进行大量替换,因此我们希望避免这种解决方案。
<!-- the workaround composite component -->
<cc:interface>
<cc:attribute name="methodBean" required="true" type="com.example.myBean" />
...
<cc:implementation>
<h:commandLink>
<f:ajax listener="#{cc.attrs.methodBean.myMethod}" />
<f:attribute name="myAttribute" value="myValue" />
</h:commandLink>
答案 0 :(得分:0)
好吧,我没有看到BalusC的另一个相关问题this answer。我仍然不明白为什么我的代码在WF9上运行并在WF10上运行,但这是一个简单的解决方案,除了组件本身我们不需要改变任何东西:
private static String escape(String s) {
return s != null ? s.replaceAll("\'", "\'\'") : null;
}
<!-- the CC xhtml -->
<h:commandLink>
<f:ajax listener="#{cc.methodListener}" />
<f:attribute name="myAttribute" value="myValue" />
</h:commandLink>