tutorial que mvc faces example español ejemplos ejemplo bean jsf jsf-2 managed-bean message-bundle

jsf - mvc - ¿Cómo puedo obtener una cadena de paquete de mensajes desde dentro de un bean administrado?



jsf netbeans tutorial pdf (3)

Hay dos maneras de obtener el paquete de recursos String en bean administrado, usando baseName o varName (vea la definición de cada uno a continuación):

Usando varName:

varName : es la cadena que representa el <var></var> en <resource-bundle>

FacesContext context = FacesContext.getCurrentInstance(); Application app = context.getApplication(); ResourceBundle bundle = app.getResourceBundle(context, varName); String msg = bundle.getString("key");

Usando baseName:

baseName : nombre completo del paquete de recursos ( <base-name> en <resource-bundle> ).

FacesContext context = FacesContext.getCurrentInstance(); Locale locale = context .getViewRoot().getLocale(); ClassLoader loader = Thread.currentThread().getContextClassLoader(); ResourceBundle bundle = ResourceBundle.getBundle(baseName, locale, loader); String msg = bundle.getString("key");

Me gustaría poder recuperar una cadena de un paquete de mensajes desde dentro de un bean gestionado JSF 2. Esto se haría en situaciones donde la cadena se usa como el parámetro de resumen o detalles en un FacesMessage o como el mensaje en una excepción lanzada.

Quiero asegurarme de que el bean administrado cargue el paquete de mensajes correcto para la configuración regional del usuario. No me queda claro cómo hacer esto desde un bean gestionado usando llamadas API JSF.

Mi configuración es:

  • Usar Tomcat 7 como contenedor para que la solución no pueda depender de llamadas API que solo funcionen en un contenedor de servidor de aplicaciones completo
  • Uso de la implementación de referencia JSF 2 (Mojarra)
  • NO utilizando ninguna biblioteca que permita CDI

NOTA: Vi esta pregunta similar , pero depende de las características que no están disponibles en mi configuración

EDIT: cometí un error en mi pregunta original. Lo que quise preguntar fue "¿Cómo puedo obtener una cadena de paquete de recursos desde dentro de un bean administrado"? BalusC me dio la respuesta correcta para lo que pregunté. La solución para lo que en realidad quería hacer es muy similar:

public static String getResourceBundleString( String resourceBundleName, String resourceBundleKey) throws MissingResourceException { FacesContext facesContext = FacesContext.getCurrentInstance(); ResourceBundle bundle = facesContext.getApplication().getResourceBundle( facesContext, resourceBundleName); return bundle.getString(resourceBundleKey); }

Además, aquí hay un enlace a otra pregunta que explica la diferencia entre los paquetes de "mensaje" y los paquetes de "recursos".


Puede obtener el nombre completo del paquete calificado de <message-bundle> por Application#getMessageBundle() . Puede obtener la configuración regional actual mediante UIViewRoot#getLocale() . Puede obtener un ResourceBundle de un nombre de paquete calificado completo y la configuración regional mediante ResourceBundle#getBundle() .

Entonces, resumió:

FacesContext facesContext = FacesContext.getCurrentInstance(); String messageBundleName = facesContext.getApplication().getMessageBundle(); Locale locale = facesContext.getViewRoot().getLocale(); ResourceBundle bundle = ResourceBundle.getBundle(messageBundleName, locale); // ...

Actualización : según el error en la pregunta, realmente desea obtener el paquete identificado por <base-name> de <resource-bundle> . Desafortunadamente, esto no está disponible directamente por una API JSF estándar. messageBundleName codificar el mismo nombre base en el código y sustituirlo con el messageBundleName del messageBundleName en el ejemplo anterior o inyectarlo como una propiedad administrada en <var> en un bean con ámbito de solicitud:

@ManagedProperty("#{msg}") private ResourceBundle bundle; // +setter


FacesContext context = FacesContext.getCurrentInstance(); ResourceBundle bundle = context.getApplication().getResourceBundle(context, "msg"); String message = bundle.getString("key");

aquí está la clave es el nombre de la propiedad a la que desea acceder desde el archivo de propiedades.

message = This is "message"

Esta entrada es del archivo messages.properites. y "mensaje" es "clave".