Spring - Cada Macaco em seu galho

11 respostas
SilverFangs

Boa tarde pessoal, estou tendo a seguinte dificuldade.

estou usando o Spring para criar um aplicativo. o aplicativo (simples, é um jar) em si está funcionando em meus testes unitários, porem quando eu adiciono ao meu projeto web onde ela será utilizada, ela não enxerga as classes injetadas e dá erro, é como se ela estivesse tentando acessar o contexto da aplicação web. sendo que são arquivos diferentes, um está dentro do jar e outro dentro do projeto web. mas é como se ele tivesse tentando ler o contexto da aplicação web para carregar as injeções.

-tentei utilizar sem anotação achando que seria algum parametro que não daria pra ser passado na anotação.

-tentei instanciando o objeto e carregando o contexto com a classe ClassPathXmlApplicationContext na classe de fachada do aplicativo, e acontece o mesmo problema.

-todos os parametros do applicationContext e inclusive o nome do aplicationContext do aplicativo estão diferentes do da aplicação web.
segue o trace.

SEVERE: Exception sending context initialized event to listener instance of class org.springframework.web.context.ContextLoaderListener org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'migradorUF' defined in file [/home/fabio/Trabalho/workspace/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/aplicacaoweb/WEB-INF/classes/br/com/aplicativo/imp/MigradorUF.class]: Instantiation of bean failed; nested exception is org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [br.com.aplicacaoweb.model.util.migracao.imp.MigradorUF]: Constructor threw exception; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'listador' is defined

Se alguém já passou por isso. fico grato com a passagem de experiência.

Obrigado e Boa tarde!

11 Respostas

heatcold

crie um novo application context no frontend, que será utilizado apenas para os beans da camada de visualização (no seu caso o projeto web)
ex:
frontend-applicationContext.xml

e importe o application context do backend:

<beans> <import resource="applicationContext.xml"/> </beans>
Funciona tanto com annotations quanto com a configuração utilizando apenas xml.

Referencia (seção 3.18. Importing Bean Definitions from One File Into Another):
http://static.springsource.org/spring/docs/1.2.x/reference/beans.html

SilverFangs

então resolveu essa parte do problema,

apesar de eu achar meio estranho ter que importar um applicationContext.xml para outro q está em outro módulo da aplicação, isso foge da idéia inicial do spring. opnião minha. :wink:

mas apareceu outro problema, que no caso ele não deixa carregar 2 persistenceContextFactory no mesmo escopo. acontece esse erro.

eu estou usando a classe org.springframework.orm.jpa.LocalEntityManagerFactoryBean como factory da EM.

tem alguma sugestão ?

Obrigado pela ajuda!

heatcold

voce precisa de dois beans do tipo javax.persistence.EntityManagerFactory?
caso contrário, mantenha apenas um bean para o EntityManagerFactory no applicationContext.xml

no frontent-applicationContext.xml voce deve manter apenas os beans relacionados a camada de visualização (exemplo: view-resolver)

SilverFangs

Opa Cllint, rs…

Então, eu to usando na verdade 2 persistenceUnit, pois estou usando 2 bases diferente… no caso então se eu for usar apenas um factory de entityManager, como eu colocaria 2 persistenceUnite dentro da factory?

heatcold

Infelizmente não tive este problema, então não posso garantir a solução.

De uma olhada nesse link:
http://forum.springsource.org/showthread.php?34301-Need-help-with-Spring-JPA-Hibernate-to-connect-to-multiple-databases
Parece que o problema acontece quando se tem duas unidades de persistencia com o mesmo nome.

Nesse outro link, está um tutorial de como implementar multiplas unidades de persistencias:
http://turgayzengin.blogspot.com/2007/09/multiple-persistence-units-with-spring.html

SilverFangs

blz, vou pesquisar e achando a solução eu posto aqui.

Obrigado Cara!

tdisanti

Você colocou qual a indicação de qual persistence unit vai usar no seu entityManager?

Ex.: @PersistenceContext(unitName = “PU2”)

Estou com a configuração aparentemente feita. Sobe meu tomcat. Mas ao tentar entrar na aplicação pelo browser dá uma mensagem que não conseguiu encontrar o bean do entityManager.

Você conseguiu encontrar a solução?

SilverFangs

Cara, a solução foi fazer um novo projeto e usando ele referenciado no projeto main, não consegui fazer 2 PersistenceContext rodar na mesma aplicação, da forma q eu fiz basta configurar o spring pra cada aplicação e no context do projeto main, via JNDI, buscar os dados de conexão que vai tranquilo pra cada projeto.

tdisanti

Não tinha pensado nisso mas é uma forma de contornar. No meu caso terei que conectar em 3 bancos… é até estranho ter que montar 3 projetos para resolver isto. Com certeza deve haver uma forma mais simples de fazer.

Coloquei outro tópico pra ver se alguém dá uma luz. Se quiser dar uma olhada: http://www.guj.com.br/java/265689-configuracao-spring-3–jpa-multiplos-database

No tópico tem a configuração que estou usando. Falta alguma coisa que ainda não descobri.

Obrigado pela ajuda.

SilverFangs

Da uma olhada tambem no Hibernate 4, veio uma nova funcionalidade chamada multitenacity, que faz conexao com varios bancos de dados ao mesmo tempo, dessa forma , eu acredito que vc teria uma entityManager para varias conexões com o banco, posso estar falando besteira pois não cheguei a dar uma olhada a fundo nisso. mas é uma opção…

Atenciosamente.

tdisanti

Legal cara… vou dar uma olhada sim. Se descobrir alguma coisa eu posto aqui pra você.

Obrigado

Criado 21 de outubro de 2011
Ultima resposta 18 de fev. de 2012
Respostas 11
Participantes 3