Mojarra-Bug在作为include参数传递时解析#{cc}并由包含的复合使用?

时间:2017-11-25 13:05:20

标签: jsf el jsf-2.2 composite-component mojarra

基本问题

这是Mojarra的错误还是我试图做一些规范不支持的事情?

概述

我有一个复合组件“outerComposite”,ui:include是一个带有另一个复合组件“innerComposite”的facelet。我想使用<ui:param>将外部组合的客户端ID传递给内部组合。根据EL表达式的外观,这在Wildfly 10/11上有效或失败,但在Websphere Liberty 17.0.0.1上适用于所有情况。

基本代码

outerCompositeUsingPage.xhtml

<h:head />
<h:body>
    <h:form id="form">
        <app:outerComposite id="outer" value="Test" />
    </h:form>
</h:body>

outerComposite.xhtml ,其中包含 innerComposite 的facelet:

<cc:implementation>
<c:set var="clientIdViaSet" value="#{cc.clientId}" /> 
<div id="#{cc.clientId}">
   <ui:include src="innerCompositeInclude.xhtml">
        <ui:param name="clientIdDirect" value="#{cc.clientId}" />     <-- WORKS   
        <ui:param name="clientIdViaMethod" value="#{compositeHelperBean.getClientId(cc)}" />    <-- FAILS   
        <ui:param name="clientIdViaSet" value="#{clientIdViaSet}" />        <-- WORKS
   </ui:include>
</div>

innerCompositeInclude.xhtml

<ui:composition xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:app="http://xmlns.jcp.org/jsf/composite/components/app" >
    <app:innerComposite id="inner"
                    value1Key="Direct"
                    value1Value="#{clientIdDirect}"
                    value2Key="Via Method"
                    value2Value="#{clientIdViaMethod}"
                    value3Key="Via c:set"
                    value3Value="#{clientIdViaSet}"
                   />
</ui:composition>

innerComposite.xhtml

<cc:interface>
    <cc:attribute name="value1Key" type="java.lang.String" />
    <cc:attribute name="value2Key" type="java.lang.String" />
    <cc:attribute name="value3Key" type="java.lang.String" />
    <cc:attribute name="value1Value" type="java.lang.String" />
    <cc:attribute name="value2Value" type="java.lang.String" />
    <cc:attribute name="value3Value" type="java.lang.String" />
</cc:interface>
<cc:implementation>
    <div id="#{cc.clientId}">
       <h:panelGrid columns="2">
           <h:outputText value="#{cc.attrs.value1Key}" />
           <h:outputText value="#{cc.attrs.value1Value}" />
           <h:outputText value="#{cc.attrs.value2Key}" />
           <h:outputText value="#{cc.attrs.value2Value}" />
           <h:outputText value="#{cc.attrs.value3Key}" />
           <h:outputText value="#{cc.attrs.value3Value}" />
        </h:panelGrid>                    
    </div>
 </cc:implementation>

ComponentHelperBean.java

@ApplicationScoped
@Named
public class CompositeHelperBean {
    public String getClientId(UIComponent comp) {
       return comp.getClientId();
    }
}

观察

由于#{cc.clientId}作为参数传递给包含文件,因此我希望#{cc.clientId}外部复合的值。这确实有效。 因为#{compositeHelperBean(cc)}只调用cc.getClientId(),所以我希望这会产生与直接EL表达式#{cc.clientId}相同的结果。这是的情况;相反,它解析为内部复合组件的客户端ID。 结果如下所示 Wildfly 10/11

Direct      form:outer            <--- OK
Via Method  form:outer:inner      <--- WRONG
Via c:set   form:outer            <--- OK

结果在 Websphere Liberty Profile 17.0.0.1

中显示如下
Direct      form:outer            <--- OK
Via Method  form:outer            <--- OK
Via c:set   form:outer            <--- OK

研究

我已经研究过Mojarra和MyFaces的代码。两者都有一个用于创建ValueExpression的TagHandlerImpl。在那里,他们使用正则表达式来确定EL是否与cc有关。两种表达方式都不同,可以解释为什么行为不同。

0 个答案:

没有答案