[RESOLVIDO] Obtendo mensagens (Resource Bundle) do banco de dados no JSF

Olá!

Estou precisando internacionalizar meu aplicativo que usa JSF+EJB. Se eu pudesse usar arquivos .properties seria muito simples :). Porém, devido a algumas razões internas, preciso colocar as mensagens em tabelas no banco de dados.

Estou tendo dificuldades em encontrar material sobre isso, pesquisei, pesquisei mas está difícil.

Minha última tentativa foi extender ListResourceBundle e ao mesmo tempo anotar a classe como ManagedBean/ApplicationScoped. Porém, mesmo assim não consigo injetar meu EJB que faz query no banco dentro do ResourceBundle, vejam abaixo:


@ManagedBean(eager=true)
@ApplicationScoped
public class ResourceDic extends ListResourceBundle {

	@EJB
	private MeuDAO meuDAO;
	
	@Override
	protected Object[][] getContents() {
		List<Dic> dic = atualizaDicionario();
		
		Object[][] content = new Object[dic.size()][2];
		
		for(int i = 0; i <= dic.size(); i++) {
			content[i][0] = dic.get(i).getAtrCodigo();
			content[i][1] = dic.get(i).getAtrMensagem();
		}
		
		return content;
	}
	
	private List<Dic> atualizaDicionario() {
		return meuDAO.obtemDicionario(); // genericoDAO é nulo nesse ponto
	}

}

Agora, se coloco a chamada do método obtemDicionario dentro de um PostConstruct, o meuDAO deixa de ser nulo e o método é chamado, porém dentro do getContents a lista volta a ser nula.

Minha suspeita é que a classe ResourceDic é criada como um ManagedBean pelo container, e uma outra instância é criada pela ferramenta de Bundle do Java, e essa segunda instância não tem acesso à injeções…

Enfim, estou tateando ainda esse problema, se alguém souber de uma maneira melhor ou um outro caminho para atingir esse objetivo não hesite em falar.

Grande abraço!

A injeção do seu dao com o @EJB
é feita por último, a maneira é chama-lo no postConstruct mesmo.

é, mas a instância criada através do @ManagedBean não é a mesma da instanciada pela ferramenta de bundle. Então meu DAO fica disponível no @PostConstruct, porém a instância que efetivamente é usada para obter mensagens não possui acesso a injeção, entendeu?

Ok, consegui resolver com ajuda do Stack Overflow.

Ao invés de injetar o EJB, obtive uma referências através do JNDI:

Context ctx = new InitialContext();
MyDao myDao = (MyDao) ctx.lookup("myapp/myejbmodule/MyDao!org.myapp.ejb.MyDao");