Pregunta

Tengo una exsisting Java/JSF página web todo el texto en la pantalla es la que viene de propiedad de archivos a través de <f:loadBundle basename="org.example.applicaltion" var="applicaltion" /> que extrae el texto de applicaltion.propiedades.

Para un tiempo de ejecución configurable subconjunto de estos estoy deseando tirar de la cuerda desde otro lugar (CMS a través de servicios web).Mirando un resourcebundle clase appares tener un infrastructer para algo cercano a este con la delegación a un padre un resourcebundle.

Estoy deseando somethis como este

public class Applicaltion extends ResourceBundle{
    @Override
protected Object handleGetObject(String key) {
    if(overridenKey(key)){
        return overridedValue(key);
    }
    return null; // ResourceBundle.getObject will delegate to parent 
             // if we return null
}
}

He probado este y el padre es nulo, supongo que esto es más utilizado para el caso de incumplimiento -> en -> es_es.

Estoy considerando la no muy atractiva la opción de tener la propiedad de archivo con un nombre diferente de la costumbre un resourcebundle y, a continuación, delegando a través de la pila completa de un resourcebundle.getBundle(PROPERTY_FILE_NAME).getString(clave) desde dentro de CustomResourceBundle.handleGetObject(clave).

Mejores ideas?

¿Fue útil?

Solución

Terminé resolviendo esto comprobando si teníamos un valor de anulación, si lo devolvíamos, o lo delegué al paquete de recursos estándar

public class UILabels extends ResourceBundle {


private ResourceBundle getFileResources(){
    return ResourceBundle.getBundle("com.example.web.UILabelsFile", this.getLocale());
}

public Enumeration<String> getKeys() {
    return getFileResources().getKeys();
}

protected Object handleGetObject(String key) {
    if(overrideValue(key)){
        return getOverridenValue(key);
    }
    return getFileResources().getObject(key);
}

}

Tenga en cuenta que la ligera diferencia en la clase de nombre es UILabels, que es lo que todos los clientes usarán en el archivo es UILabelsFile para que el cargador ResourceBundle no sea recursivo.

Otros consejos

Podría escribir una costumbre PropertyResolver, y luego tener que realizar la lógica de dónde extraer los valores de propiedad.

Por ejemplo, se podría definir un bean llamado messageSource y tener que cargar la aplicación.propiedades, además de su CMS propiedades o lo que tengas.

A continuación, escribir una costumbre PropertyResolver (hay un ejemplo de cómo hacer esto con la Primavera MessageSource aquí) y el enlace a su faces-config.xml el uso de algo como esto:

<application>  
<property-resolver>  
      com.package.MessageSourcePropertyResolver  
   </property-resolver>  
</application>   
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top