validation - Errores de validación/conversión de<f: viewParam> do not localize to<f: view locale>, pero a configuración regional predeterminada
jsf jsf-2 (1)
Puedo reproducir tu problema. Tanto Mojarra 2.1.25 como MyFaces 2.1.12 exponen el mismo problema. Por lo tanto, no estoy seguro de si esto es un error en JSF impl o un descuido en las especificaciones de JSF. Hasta el momento, resulta que la configuración regional viewroot no se ha establecido para una solicitud GET antes de que se ingrese la fase de respuesta al renderizado. El convertidor se ejecuta durante la fase de validaciones, mucho antes de la respuesta de procesamiento, lo que explica por qué obtuvo la configuración regional predeterminada. Tengo que investigarlo más adelante y, si es necesario, informar un problema a Mojarra.
Mientras tanto, su mejor opción para resolver este problema es obtener el paquete de la siguiente manera en lugar de evaluar EL <resource-bundle><var>
:
String basename = "com.example.i18n.message"; // Exactly the same as <resource-bundle><base-name>
Locale locale = context.getApplication().evaluateExpressionGet(context, "#{localeBean.locale}", Locale.class);
ResourceBundle bundle = ResourceBundle.getBundle(basename, locale);
// ...
Actualización : He informado el problema 3021 según este problema. Todavía no puedo entender lo que dice la especificación en este punto, pero considero que el comportamiento de la implementación no es intuitivo.
Actualización 2 : los muchachos de Mojarra y MyFaces estuvieron de acuerdo en esto. Para Mojarra, se ha corregido según 2.2.5 (¿todavía no hay 2.1.x backport?) Y para MyFaces se ha corregido según 2.0.19, 2.1.13 y 2.2.0.
Tengo una etiqueta <f:viewParam>
en las páginas JSF que establece los parámetros GET en el bean gestionado correspondiente después de la conversión y la validación.
Si se producen errores de conversión o validación, se obtiene un mensaje de error apropiado de un paquete de recursos y se muestra en <p:messages>
(también puede ser <p:growl>
o <h:messages>
).
La aplicación es multilingüe. Por lo tanto, cuando se selecciona un idioma diferente, debe mostrarse un mensaje en ese idioma, pero siempre muestra el mensaje de acuerdo con la configuración regional predeterminada (para inglés).
Test.xhtml:
<!DOCTYPE html>
<html lang="#{localeBean.language}"
xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core">
<f:view locale="#{localeBean.locale}">
<f:metadata>
<f:viewParam name="id" converter="#{myConverter}" />
</f:metadata>
<h:head>
<title>Test</title>
</h:head>
<h:body>
<h:messages />
</h:body>
</f:view>
</html>
El convertidor:
@FacesConverter("myConverter")
public final class MyConverter implements Converter
{
@Override
public Object getAsObject(FacesContext context, UIComponent component, String value)
{
ResourceBundle bundle = context.getApplication()
.evaluateExpressionGet(context, "#{messages}", ResourceBundle.class);
String message = bundle.getString("id.conversion.error");
throw new ConverterException(
new FacesMessage(FacesMessage.SEVERITY_ERROR, message, null));
}
@Override
public String getAsString(FacesContext context, UIComponent component, Object value)
{
throw new UnsupportedOperationException(); // Not relevant in this problem.
}
}
Excepto por los mensajes de <f:viewParam>
, no hay problema. Todos los demás tipos de mensajes se muestran en el idioma seleccionado por el usuario.
¿Hay algo especial con <f:viewParam>
?