referencia de parámetro a bean que no se pasa al componente compuesto

Tengo algunos problemas con un componente compuesto en JSF 2.1 vainilla (en Glassfish 3.1). la versión simplificada de mi problema está aquí:

[componente compuesto]

<?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>

[implementado en]

              <!-- 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>

el problema es que "thisPerson.usernameValidator" está evaluando a NULL, lo que luego hace que com.sun.faces.facelets.tag.jsf.ValidatorTagHandlerDelegateImpl salte al código que intenta cargar el validador por "validatorID", que es no configurado porque estamos tratando de enviar el validador mediante "enlace". ¿Hay alguna manera de hacer que el compuesto evalúe el valor de ui:param, o una solución alternativa que no requiera volver a trabajar en el validador (es un gran antipatrón y no tengo tiempo para revertir el daño en este momento)? suponga que el validador TIENE que entrar a través de un enlace.

Sé que el compuesto funciona porque en una faceta diferente, tengo el validador enlazado con una referencia de bean concreta, en lugar de una referencia "suave", y funciona como un campeón.

TIA

preguntado el 27 de julio de 12 a las 19:07

1 Respuestas

Sin conocer su implementación exacta de JSF, voy a asumir que Mojarra, es posible que se encuentre con el siguiente error conocido.

http://java.net/jira/browse/JAVASERVERFACES-2040

Independientemente de si este es su problema exacto o no, puede intentar deshabilitar el guardado de estado parcial y ver si esto resuelve su problema. Si es así, significa que se enfrenta a este problema, que aparentemente fue (¿arreglado?) en versiones posteriores de Mojarra.

Otra posibilidad sería simplemente utilizar renderFacet en lugar de insertChildren e inserta tus validadores en forma de faceta.

Respondido 27 Jul 12, 20:07

Probaré el enfoque renderFacet e informaré mis resultados. gracias por la idea /cruza los dedos - lo

usar faceta no ayudó. Supongo que es un problema de tiempo de fase (el CC probablemente se esté constituyendo antes de que el parámetro esté disponible). desgraciado. Voy a dejar esto "sin respuesta" en caso de que alguien sepa de una solución funcional. - lo

aunque no hay una "solución alternativa", este es un buen comentario sobre la pregunta: lo

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.