f:复合组件中的ajax侦听器在WildFly 10中停止工作

时间:2017-04-18 13:59:25

标签: jsf-2.2 composite-component wildfly-10

我们在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>

1 个答案:

答案 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>