Jsf 对未传递到复合组件的bean的param引用

Jsf 对未传递到复合组件的bean的param引用,jsf,components,composite,Jsf,Components,Composite,我在JSF2.1香草(Glassfish3.1)中的复合组件方面遇到了一些问题。我的问题的简化版本如下: [复合成分] <?xml version='1.0' encoding='UTF-8' ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="

我在JSF2.1香草(Glassfish3.1)中的复合组件方面遇到了一些问题。我的问题的简化版本如下:

[复合成分]

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:f="http://java.sun.com/jsf/core"
      xmlns:c="http://java.sun.com/jsp/jstl/core"
      xmlns:ui="http://java.sun.com/jsf/facelets"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:p="http://primefaces.org/ui"
      xmlns:cc="http://java.sun.com/jsf/composite">

    <!-- INTERFACE -->
    <cc:interface>

            <cc:attribute name="value" required="true"/>
            <cc:attribute name="title" required="false" default=""/>

            <cc:editableValueHolder name="inputTarget" targets="labeledInputField"/>

    </cc:interface>

    <!-- IMPLEMENTATION -->
    <cc:implementation>

            <p:inputText id="labeledInputField" 
                label="#{cc.attrs.title}"
                value="#{cc.attrs.value}" 
                title="#{cc.attrs.title}">

                <cc:insertChildren/>

            </p:inputText>

    </cc:implementation>
</html>

[年实施]

              <!-- thisPerson is passed in via ui:param to the facelet containing this code.  
                it works in other (non-composite) components on the page -->

              <comp:labeledInputText
                  id="baseUsername"
                  value="#{controller.username}"
                    title="#{bundle.Username}">

                  <f:validator for="inputTarget" binding="#{thisPerson.usernameValidator}"/>
                  <f:converter for="inputTarget" converterId="#{whiteSpaceTrimConverter}"/>

              </comp:labeledInputText>

问题是,“thisPerson.usernameValidator”的计算结果为NULL,这会导致com.sun.faces.facelets.tag.jsf.ValidatorTagHandlerDelegateImpl跳到试图通过“validatorID”加载验证器的代码,该代码未设置,因为我们试图通过“绑定”发送验证器。是否有一种方法可以让合成元素评估ui:param值,或者有一种不需要重新修改验证器的解决方法(这是一个巨大的反模式,我现在没有时间扭转这种损害)。假设验证器必须通过绑定进入

我知道这个组合是有效的,因为在另一个facelet中,我将验证器绑定到一个具体的bean引用,而不是一个“软”引用,它的工作方式就像champ


TIA

在不知道具体的JSF实现的情况下,我假设Mojarra,您可能会遇到以下已知错误

无论这是否是您的确切问题,您都可以尝试禁用部分状态保存,看看这是否解决了您的问题。如果是这样的话,那就意味着你面临着这个问题,这显然是在Mojarra的后续版本中(修复了?)的


另一种可能是简单地使用
renderFacet
而不是
insertChildren
,并以facet的形式插入验证器。

我将尝试renderFacet方法并报告我的结果。谢谢你的主意/交叉指关节面没有帮助。我猜这是一个阶段时间问题(CC可能是在参数可用之前组成的)。不幸。我将留下这个“未回答”的问题,以防有人知道功能性变通方法。即使没有“变通方法”,这也是对这个问题的一个很好的评论