2010-07-16 5 views
5

En mi página JSF2, estoy usando mensajes de error internacionalizados.JSF <h: outputFormat>: use valores de matriz como parámetros

En mi bean de respaldo, estoy poniendo los mensajes en el Alcance del flash:

flash.put("error", exception.getType()); 

En la página, esta cadena se traduce de esta manera:

<h:outputText value="#{bundle[flash.error]}"/> 

funciona bien.

AHORA quiero también poder poner (un número arbitrario de) parámetros en el texto del mensaje, que se insertan en los marcadores de posición en la propiedad i18n en mi message.properties. Por lo tanto, estoy poniendo los parámetros como una matriz de cadenas en el Alcance del flash, así:

//exception.getParameters returns String[] 
flash.put("errorParams", exception.getParameters()) 

Ahora también quiero ser capaz de utilizar esta matriz de cadena como parámetros para un elemento outputFormat, para insertarlos en una propiedad como Welcome, {0} {1}. así que traté de lograr esto mediante el uso de ui: repetir:

<h:outputFormat value="#{bundle[flash.error]}" rendered="#{! empty flash.error}" class="invalid"> 
    <ui:repeat value="#{flash.errorParams}" var="_param"> 
    <f:param value="#{bundle[_param]}"/> 
    <!-- also doesn't work: <f:param value="#{_param}"/>--> 
    </ui:repeat> 
</h:outputFormat> 

Por desgracia, el valor de parámetro se ignora y los marcadores de posición de la i18n-propiedad no se sustituyen, por lo que el resultado representado es Welcome, {0} {1}. Cuando se usa un repetidor "regular", mostrando los elementos de la matriz como un texto de salida, funciona. Por lo tanto, la etiqueta outputFormat no parece apoyar el uso de una repetición como un niño. Maldita sea, tan cerca;) ¿Alguien sabe una buena manera de hacer lo que quiero, o hay alguna biblioteca componente que soporte algo así?

Respuesta

7

El problema aquí es que ui:repeat es un elemento secundario de h:outputFormat que no admite. Le gustaría poner elementos f:param múltiples directamente como elementos secundarios de h:outputFormat durante el tiempo de compilación.

El c:forEach es adecuado para esta tarea. Las etiquetas básicas JSTL (que ya están incluidas en Facelets, por lo que no es necesario instalar ningún JAR adicional) hacen su trabajo durante construyendo el árbol de vista, justo antes de que sea JSF cambie a proceso/render árbol de vista.

<html xmlns:c="http://java.sun.com/jsp/jstl/core"> 
... 
<h:outputFormat value="#{bundle[flash.error]}" rendered="#{! empty flash.error}" class="invalid"> 
    <c:forEach items="#{flash.errorParams}" var="_param"> 
    <f:param value="#{bundle[_param]}"/> 
    </c:forEach> 
</h:outputFormat> 
+0

Funciona como un encanto. ¡¡¡Muchas gracias!!! – ifischer

+1

De nada. Interesante caso de uso del alcance del flash por cierto. – BalusC

+0

Sí, lo descubrí hace unos días. Tuve problemas con FacesMessages ya que no sobreviven a los redireccionamientos (lo que hago a menudo), así que estoy usando el Flash-Scope, que es un reemplazo ideal. – ifischer

Cuestiones relacionadas