Pergunta

Eu tenho um site exsisting Java / JSF todo o texto na tela é proveniente de arquivos de propriedade através de que puxa o texto da applicaltion. Propriedades.

Para um tempo de execução subconjunto configurável desses eu estou querendo puxar a corda de outro lugar onde (CMS através de serviços web). Olhando para a classe ResourceBundle que appares ter uma infrastructer para algo próximo a este com a delegação a um ResourceBundle pai.

Estou querendo 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
}
}

Eu tentei isso e pai é nulo, eu assumo isso é mais usado para o caso de inadimplência -> en -.> En_GB

Eu estou considerando a opção não muito atraente de ter o arquivo de propriedades de um nome diferente do costume ResourceBundle e, em seguida, a delegação através da pilha completa de ResourceBundle.getBundle (PROPERTY_FILE_NAME) .GetString (key) de dentro CustomResourceBundle.handleGetObject (key) .

Qualquer idéias melhores?

Foi útil?

Solução

acabei resolvendo isso verificando se tivéssemos um valor de substituição, se fizéssemos o retorno que, de outra delegação para o recurso padrão pacote

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);
}

}

Observe a pequena diferença de classe nome é UILabels que é o que todos os clientes usarão o arquivo é UILabelsFile assim o carregador ResourceBundle não vai recursiva.

Outras dicas

Você poderia escrever um PropertyResolver personalizado e, em seguida, ter que executar a lógica de onde puxar os valores de propriedade de.

Por exemplo, você poderia definir um bean chamado messageSource e ter essa carga até application.properties, além de suas propriedades CMS ou o que você tem.

Em seguida, escreva um PropertyResolver personalizado (há um exemplo de como fazer isso com o Primavera MessageSource aqui ) e ligá-lo ao seu faces-config.xml usando algo parecido com isto:

<application>  
<property-resolver>  
      com.package.MessageSourcePropertyResolver  
   </property-resolver>  
</application>   
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top