2012-02-24 21 views
9

Estoy usando JSF 2. Estoy tratando de resolver una referencia de paquete de mensajes dinámicamente la propiedad de un bean administrado. El valor contiene el nombre del paquete y la clave. Esto es necesario ya que el valor puede provenir de uno de los pocos paquetes diferentes. He intentado muchas permutaciones, pero el valor del bean parece que siempre se resuelve como una cadena literal (dando salida con corchetes EL) y el paquete nunca se llama para resolver y devolver el valor. ¿Algunas ideas?¿Cómo obtener un valor de propiedad del paquete de recursos JSF en el bean de respaldo?

que he intentado:

#{bundle['key']} 
${bundle['key']} 
bundle['key'] 

Ellos se emiten exactamente como está, también en un <h:outputText>. Funciona bien si lo escribo directamente en la página. Mi teoría es que JSF no se da cuenta de que tiene que procesar el String como una expresión. ¿Hay alguna forma de forzarlo?

Respuesta

17

EL solo se resolverá en la vista, no en el modelo. De lo contrario, sería un gran agujero de ataque de inyección EL que permite a los usuarios ingresar expresiones EL arbitrarias en campos de entrada y resolverlos. No, no puedes forzarlo de ninguna manera.

Tiene que resolverlo usted mismo. Puede hacerlo por cualquiera de evaluarla mediante programación utilizando Application#evaluateExpressionGet():

FacesContext context = FacesContext.getCurrentInstance(); 
String value = context.getApplication().evaluateExpressionGet(context, "#{bundle['key']}", String.class); 
// ... 

O, en este caso particular, sólo por el uso del ResourceBundle API directamente al igual que como JSF está haciendo bajo las sábanas:

ResourceBundle bundle = ResourceBundle.getBundle(basename, FacesContext.getCurrentInstance().getViewRoot().getLocale()); 
String value = bundle.getString("key"); 
// ... 
+0

Gracias BalusC por su pronta respuesta y útiles, esto ha respondido a mi pregunta. – RobP

+0

De nada. – BalusC

1

Try este ..

recursos Bundle referenciado por msg

USD=$ 

código XHTML:

<c:set var="key" value="#{managedBean.currencyCode}" /> 
<h:outputText value="#{msg[key]}"/> 

Esto debería funcionar ..

Cuestiones relacionadas