| Autor |
Mensagem |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 09/06/2008 14:38:02
|
romuloff
Java Ninja
![[Avatar]](/images/avatar/16d62f85a33e3e975a40c787b69d68dd.jpg)
Membro desde: 02/07/2007 14:56:24
Mensagens: 254
Localização: Uberlandia - MG
Offline
|
DEFINIÇÃO DO PROBLEMA 1 :
Meu alvo principal é que o spring faça o rollback dos dados do banco após o teste unitário.
Já implementei isso com sucesso usando apenas um dataSource. (AbstractTransactionalDataSourceSpringContextTests)
Mas para o spring interpretar dois datasource, preciso de definir um transactionManager e utilizar outra classe da api (AbstractTransactionalSpringContextTests), juntamente com a api do jotm ( separada ou a que vem no spring ).
A api jotm me permite definir para o spring "visualizar dois dataSource's através de um transactionManager".
Fiz a implementação das duas maneiras: com a api do jotm separada e com a inclusa no spring.
Ao rodar os testes unitários das 2 formas, está dando o mesmo erro.
Mas estranho que acho que o erro é algo sobre a obtenção do application context pelo spring.
Obs: Nestas classes usadas para o spring fazer o rollback (ex:AbstractTransactionalDataSourceSpringContextTests e AbstractTransactionalSpringContextTests), deve-se implementar o método getConfigLocations() da superclasse, ao inves de usar um "ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext-test.xml");" (como seria feito em um teste unitário simples do JUnit ( extends TestCase ). Assim foi feito para meu teste com apenas um dataSource ( extends AbstractTransactionalDataSourceSpringContextTests ) e tambem para este teste que estou com problemas ( extends AbstractTransactionalSpringContextTests) .
O erro:
java.lang.NoSuchMethodError: org.springframework.context.ConfigurableApplicationContext.registerShutdownHook()V
at org.springframework.test.AbstractSpringContextTests.getContext(AbstractSpringContextTests.java:141)
at org.springframework.test.AbstractSingleSpringContextTests.setUp(AbstractSingleSpringContextTests.java:100)
at junit.framework.TestCase.runBare(TestCase.java:12
at org.springframework.test.ConditionalTestCase.runBare(ConditionalTestCase.java:76)
at junit.framework.TestResult$1.protect(TestResult.java:106)
at junit.framework.TestResult.runProtected(TestResult.java:124)
at junit.framework.TestResult.run(TestResult.java:109)
at junit.framework.TestCase.run(TestCase.java:120)
at junit.framework.TestSuite.runTest(TestSuite.java:230)
at junit.framework.TestSuite.run(TestSuite.java:225)
at org.eclipse.jdt.internal.junit.runner.junit3.JUnit3TestReference.run(JUnit3TestReference.java:130)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:3
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:460)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:673)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:386)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:196)
Meu código:
XML utilizando a api jotm separada (parte):
XML utilizando a api jotm inclusa no spring (parte):
parte .java:
Minha suspeita sobre algo relativo à "obtenção" do applicationContext é porque no erro está dando problema aqui:ConfigurableApplicationContext.registerShutdownHook
E ConfigurableApplicationContext é a superclasse utilizada por classes que adquirem este application context (ex: ClassPathXmlApplicationContext).
PS: Estou usando spring 2.5.4 e já conferí a assinatura do método registerShutdownHook na API do spring 2.0.x e 2.5.x e são IGUAIS.
This message was edited 11 times. Last update was at 09/07/2008 14:23:29
|
|
|
 |
|
|
![[Post New]](/templates/default/images/icon_minipost_new.gif) 09/06/2008 14:57:16
|
romuloff
Java Ninja
![[Avatar]](/images/avatar/16d62f85a33e3e975a40c787b69d68dd.jpg)
Membro desde: 02/07/2007 14:56:24
Mensagens: 254
Localização: Uberlandia - MG
Offline
|
SOLUÇÃO DO PROBLEMA 1 : Ao verificar o classpath deste teste unitário (Open Run Dialog), notei que lá estava um spring-context da versão 1.0.9. Aí de alguma forma específica para a implementação com jotm que fiz, ao tentar utilizar o método ConfigurableApplicationContext.registerShutdownHook dava problema. Mas aí me perguntei: como esta biblioteca estava no classpath do teste se eu nao optei por isso ? Fui no prompt de comando e executei o comando: "mvn -X > out.txt" para verificar todas bibliotecas que o pom "importa". Na árvore das libs, verifiquei que o pom do acegisecurity que utilizo no projeto, necessita desta biblioteca (spring-context). Sendo assim, removi esta dependencia do pom do acegisecurity; e resolvi meu problema.
This message was edited 3 times. Last update was at 10/06/2008 14:22:09
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 09/06/2008 16:40:52
|
romuloff
Java Ninja
![[Avatar]](/images/avatar/16d62f85a33e3e975a40c787b69d68dd.jpg)
Membro desde: 02/07/2007 14:56:24
Mensagens: 254
Localização: Uberlandia - MG
Offline
|
DEFINIÇÃO DO PROBLEMA 2 : Na resolução que obtive acima, resolveu o erro citado, mas meu transactionManager não estava sendo atribuido aos dataSource (ou o contrário). Achei uma solução na web, mas agora preciso de saber quais modificações meus DAO devem sofrer para que eles aceitem um transaction manager do tipo JTATransactionManager, ao invés de TransactionManager. (veja mais especificamente no erro posteriormente). Ou então preciso de uma solução mais simples de atribuir o transactionManager aos meus DAO's da maneira em que estavam anteriormente ( <bean id="dataSourceSinPlans" class="org.apache.commons.dbcp.BasicDataSource" ...) XML: As classes DAO extends org.springframework.jdbc.core.support.JdbcDaoSupport. ERRO:
Initialization of bean failed; nested exception is org.springframework.beans.TypeMismatchException: Failed to convert property value of type [org.springframework.transaction.jta.JtaTransactionManager] to required type [javax.transaction.TransactionManager] for property 'transactionManager'; nested exception is java.lang.IllegalArgumentException: Cannot convert value of type [org.springframework.transaction.jta.JtaTransactionManager] to required type [javax.transaction.TransactionManager] for property 'transactionManager': no matching editors or conversion strategy found
! help !
This message was edited 6 times. Last update was at 10/06/2008 14:22:24
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 10/06/2008 07:58:36
|
romuloff
Java Ninja
![[Avatar]](/images/avatar/16d62f85a33e3e975a40c787b69d68dd.jpg)
Membro desde: 02/07/2007 14:56:24
Mensagens: 254
Localização: Uberlandia - MG
Offline
|
Se alguem nao entendeu algo do que eu descrevi, pergunte.
Não estou encontrando solução e estou precisando de ajuda !
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 10/06/2008 08:52:37
|
romuloff
Java Ninja
![[Avatar]](/images/avatar/16d62f85a33e3e975a40c787b69d68dd.jpg)
Membro desde: 02/07/2007 14:56:24
Mensagens: 254
Localização: Uberlandia - MG
Offline
|
SOLUÇÃO DO PROBLEMA 2 : Creio ter resolvido o problema. O erro que descrevi acima não era referente aos DAO, e sim aos dataSource. pois na definição da classe dos dataSource ("org.enhydra.jdbc.standard.StandardXADataSource"); o transactionManager deve ser do tipo javax.transaction.TransactionManager e não estava aceitando org.springframework.transaction.jta.JtaTransactionManager. Só não sei como teria funcionado no exemplo que ví, mas acho que o erro é este. Estarei testando agora ... Resumo: com o erro: solução. Para solucionar vou pegar o transactionmanager pela api do jotm (pois é javax.transaction.TransactionManager) , e não pelo JotmFactoryBean do spring (cuja transactionmanager é org.springframework.transaction.jta.JtaTransactionManager)
This message was edited 3 times. Last update was at 10/06/2008 14:22:51
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 10/06/2008 09:55:20
|
romuloff
Java Ninja
![[Avatar]](/images/avatar/16d62f85a33e3e975a40c787b69d68dd.jpg)
Membro desde: 02/07/2007 14:56:24
Mensagens: 254
Localização: Uberlandia - MG
Offline
|
DEFINIÇÃO DO PROBLEMA 3 : Só pra variar. Ainda estou com problemas Descobri que para definitivamente usar o transactionManager no meu teste unitário (AbstractTransactionalSpringContextTests), é preciso que eu override o método prepareTestInstance, setando o transactionManager. Pois assim fiz. Mas mesmo assim ao rodar o teste, parece que não está reconhecendo o que faço lá... erro:
org.springframework.beans.TypeMismatchException: Failed to convert property value of type [org.objectweb.jotm.Current] to required type [org.springframework.transaction.PlatformTransactionManager] for property 'transactionManager'; nested exception is java.lang.IllegalArgumentException: Cannot convert value of type [org.objectweb.jotm.Current] to required type [org.springframework.transaction.PlatformTransactionManager] for property 'transactionManager': no matching editors or conversion strategy found
O que fazer ?
This message was edited 5 times. Last update was at 10/06/2008 14:23:21
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 10/06/2008 13:13:33
|
romuloff
Java Ninja
![[Avatar]](/images/avatar/16d62f85a33e3e975a40c787b69d68dd.jpg)
Membro desde: 02/07/2007 14:56:24
Mensagens: 254
Localização: Uberlandia - MG
Offline
|
SOLUÇÃO DO PROBLEMA 3 :
aew ! resolvi este aí de cima tambem.
foi só comentar a linha:
setAutowireMode(AUTOWIRE_BY_NAME);
mas adivinha se executou sem erro ... NAO !
DEFINIÇÃO DO PROBLEMA 4 :
Próximo erro:
java.sql.SQLException: Cannot get connection for URL jdbc:mysql://localhost/centralseg : Access denied for user ''@'localhost' (using password: NO)
Lá no dataSource desta conexão eu coloquei o password, pq que ele está me informando "using password: NO" ? Onde configuro para ele usar o password ?
This message was edited 2 times. Last update was at 10/06/2008 14:24:44
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 10/06/2008 14:20:57
|
romuloff
Java Ninja
![[Avatar]](/images/avatar/16d62f85a33e3e975a40c787b69d68dd.jpg)
Membro desde: 02/07/2007 14:56:24
Mensagens: 254
Localização: Uberlandia - MG
Offline
|
nao estou conseguindo resolver. antes os dataSource estavam funcionando , com a classe de teste extendendo TestCase (teste junit normal) aí pra possibilitar a implementação deste transactionmanager a unica mudança que fiz foi trocar a classe dos datasource de org.apache.commons.dbcp.BasicDataSource pra org.enhydra.jdbc.standard.StandardXADataSource. mas as propriedades "usuario", "senha", "url" e "driverName" estão mapeadas igual estava. porque agora estaria dando problema com password ? ERRO (note que é no dataSource localhost mesmo):
java.sql.SQLException: Cannot get connection for URL jdbc:mysql://localhost/centralseg : Access denied for user ''@'localhost' (using password: NO) org.springframework.jdbc.CannotGetJdbcConnectionException: Could not get JDBC Connection; nested exception is java.sql.SQLException: SQLException in StandardPoolDataSource:getConnection exception: java.sql.SQLException: SQLException in StandardPoolDataSource:getConnection no connection available java.sql.SQLException: Cannot get connection for URL jdbc:mysql://localhost/centralseg : Access denied for user ''@'localhost' (using password: NO)
XML-AGORA: XML-ANTES: .... Onde configuro para ele usar o password ? ...
This message was edited 2 times. Last update was at 10/06/2008 14:28:10
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 10/07/2008 07:18:08
|
romuloff
Java Ninja
![[Avatar]](/images/avatar/16d62f85a33e3e975a40c787b69d68dd.jpg)
Membro desde: 02/07/2007 14:56:24
Mensagens: 254
Localização: Uberlandia - MG
Offline
|
SOLUÇÃO DO PROBLEMA 4 :
Colocar as propriedades username e password no XAPool, e não no XADataSource. Removê-las do XADataSource
Como ficou:
O pedaço do .java pra quem for precisar:
This message was edited 2 times. Last update was at 10/07/2008 07:21:05
|
|
|
 |
|
|