ola galera
tenho esse metodo que carrega minha aplicacao no browse
@Path("/")
public void index(){
return
onde é carregada http://:8080/meusistema
gostaria tb de carregar meu sistema da sequinte forma
http://:8080/meusistema/0
http://:8080/meusistema/1
etc…
como eu faria no meu controlller???
e qual seria o uso disso?
Oi Lucas eu iria controlar o aplicativo por empresa (configuracao personalizada por empresa ), entao eu queria saber para qual empresa o sistema iria trabalhar.
resolvi isso dessa forma
@Pach("/")
public void index(){ // padrao no sistemas para usar em demonstracoes etc
sessao.setEmpresa(Empresa.DEFAULT);
}
@Patch("/{empresa}"
public void index(String empresa){
if (empresa.equals("1"){sessao.setEmpresa(Empresa.EMPRESA1);}
if (empresa.equals("2"){sessao.setEmpresa(Empresa.EMPRESA2);}
{
E no meu JPAFactory fiz assin
public class JPAFactory{
private static EntityManagerFactory factory;
private static EntityManagerFactory empresa1;
private static EntityManagerFactory empresa2;
public static EntityManager getEntityManager(UserSession sessao){
Map meuconfig = new HashMap();
if (sessao.getEmpresa()==Empresa.DEFAULT && factory==null){
meuconfig.put("hibernate.connection.url","jdbc:postgresql://localhost:5432/demonstra");
factory = Persistence.createEntityManagerFactory("sistemaPU",meuconfig);
sessao.setMyfactory(factory);
}
if (sessao.getEmpresa()==Empresa.EMPRESA1 && empresa1==null){
meuconfig.put("hibernate.connection.url","jdbc:postgresql://localhost:5432/empresa1");
empresa1 = Persistence.createEntityManagerFactory("sistemaPU",meuconfig);
sessao.setMyfactory(empresa1);
}
if (sessao.getEmpresa()==Empresa.EMPRESA2 && empresa2==null){
meuconfig.put("hibernate.connection.url","jdbc:postgresql://localhost:5432/empresa2");
empresa2 = Persistence.createEntityManagerFactory("sistemaPU",meuconfig);
sessao.setMyfactory(empresa2);
}
if (sessao.getEmpresa()==Empresa.DEFAULT){
return factory.createEntityManager();
}else if(sessao.getEmpresa()==Empresa.EMPRESA1){
return empresa1.createEntityManager();
}else if(sessao.getEmpresa()==Empresa.EMPRESA2){
return empresa2.createEntityManager();
}else{
return sessao.getMyfactory().createEntityManager();
}
}
}
Meu dao ficou assim
@Component
public class ProdutoDAO{
private EntityManager manager;
public ProdutoDAO(UserSession sessao){
manager = JPAFactory.getEntityManager(sessao);
}
}
Meu Controller
@Resource
public class ProdutoController{
private Result result;
private Validator validator;
private ProodutoDAO produtodao;
public ProdutoController(Result result, Validator validator,ProdutoDAO produtodao){
this.result = result;
this.validator = validator;
this.produtodao = produtodao;
}
}
Foi a unica maneira que conseguir.
Não achei maneira melhor de fazer isso!!!
só cuidado que vc não está fechando o EntityManager… isso pode segurar todas as conexões disponíveis com o banco de dados…
o ideal é vc criar uma factory:
@Component
public class ManagerFactory implements ComponentFactory<EntityManager> {
//recebe no construtor o userSession
//salva a entityManager num atributo
//retorna o entityManager no getInstance()
@PreDestroy
public void fecha() {
manager.close()
}
}
parecido com esse cara, só vai mudar o construtor:
https://github.com/caelum/vraptor-jpa/blob/master/src/main/java/br/com/caelum/vraptor/util/jpa/EntityManagerCreator.java
daí vc recebe apenas EntityManager no construtor dos daos.