Ola,
Preciso definir qual objeto sera injetado pelo spring a partir de um arquivo de propriedade. Tem como? Há outra forma de fazer?
@Named(value="categoriaDaoB1")
public class CategoriaDaoB1 implements CategoriaDao {
...
}
@Named(value="categoriaDaoB2")
public class CategoriaDaoB2 implements CategoriaDao {
...
}
@ManagedBean
@RequestScoped
public class CategoriaController {
@Resource(name="pegar este valor no arquivo de propriedade")
private CategoriaDao dao;
...
}
A principio nao sei qual base de dados será utilizada. Entao eu preciso definir no arquivo de propriedades se B1 ou B2, para o Dao correto ser injetado. Tentei com ResourceBundle, mas nao deu certo.
Pode ser que tenha outra forma, mas nao sei.
public class CategoriaController {
ResourceBunble rb = ResourceBundle.getBundle("arquivo.properties");
@Resource(name="categoriaDao" + rb.getString("basededados");
private CategoriaDao dao;
...
}
Com um pouco de criatividade, talvez dê. Mas acho que isso vai te dar um certo trabalho, porque as anotações só aceitam constantes. Por exemplo, isso compila:
public class TesteAnn {
private static final String STRING_TESTE = "teste";
@Resource(name=STRING_TESTE)
public void metodo() {
}
}
Mas isso não:
package teste;
import javax.annotation.Resource;
public class TesteAnn {
private static final String STRING_TESTE;
static {
STRING_TESTE = "teste";
}
@Resource(name=STRING_TESTE)
public void metodo() {
}
}
Enfim, talvez você até consiga. Mas vai ter “bad smells” no seu código =/
[quote=romarcio]99% de chance de não ser possível, na minha opinião.
Mas, explica melhor, você vai ter 2 dao’s tipo UserDaoUm e UserDaoDois?
[/quote]
Eu tenho duas implementacoes do DAO para utilizar diferentes bases de dados onde as tabelas e atributos tem nomes diferentes. A aplicacao ja esta configurada para usar as duas bases de dados e as classes ja estao mapeadas para os dois bancos. Isto ja funciona. So que na hora de injetar o dao eu tenho que definir o @Resource com o nome do dao que vou injetar. Eu quero deixar o nome do banco num properties. Para na hora de rodar a aplicacao o arquivo ser lido e a injecao ser a que vou precisar. Se nao for assim teria que fazer uma POG na minha opiniao.
Se estiver usando Spring, dê uma olhada no conceito de Environments dele. De qualquer forma, existem N maneiras mais elegantes de fazer o que você quer.