Como substituir alguns recursos de um PropertyResourceBundle
-
19-08-2019 - |
Pergunta
Eu tenho um site exsisting Java / JSF todo o texto na tela é proveniente de arquivos de propriedade através de
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?
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>