Truco: Spring 3.1 y error con persistence-unit de test.

Estaba recordando Spring, siguiendo un tutorial de Francisco Grimaldo, cuando me he encontrado con un curioso error.

Tras implementar un Unit Test para la recuperación de datos de la base de datos, la ejecución ha empezado a darme el siguiente error:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name ‘entityManagerFactory’ defined in class path resource [test-context.xml]: Invocation of init method failed; nested exception is java.lang.IllegalStateException: Conflicting persistence unit definitions for name ‘springappPU’: file:/H:/Users/Manuel/Documents/workspace-sts-3.1.0.RELEASE/webMeet/target/classes, file:/H:/Users/Manuel/Documents/workspace-sts-3.1.0.RELEASE/webMeet/target/test-classes
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1486)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:524)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:461)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:295)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:223)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:292)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:194)
at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1117)
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:922)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:479)
at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:139)
at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:83)

Tras comprobar si había metido la pata en alguno de los pasos y darle muchas vueltas, sin encontrar dónde estaba el error, he terminado encontrando una solución en (como no) Stackoverflow.

La solución, por si os sirve a alguno de ayuda, pasa por renombrar la persistence-unit usada por los Unit Test de nombre:

test/resources/META-INF/persistence.xml

<persistence-unit name="springappPUtest" transaction-type="RESOURCE_LOCAL">
	</persistence-unit>

test/resources/test-context.xml

<property name="persistenceUnitName" value="springappPUtest"></property>

Y luego unificar en el mismo persistence.xml ambos ficheros.

main/resources/META-INF/persistence.xml

	<persistence-unit name="springappPU" transaction-type="RESOURCE_LOCAL">
	</persistence-unit>

	<persistence-unit name="springappPUtest" transaction-type="RESOURCE_LOCAL">
	</persistence-unit>

No es la solución más óptima, pero al menos permite que el Unit Test se ejecute.

4 comentarios en “Truco: Spring 3.1 y error con persistence-unit de test.

  1. Fredy C

    pues en este momento (10-05-2013) estoy aprendiendo spring MVC con este mismo tutorial (me a costado entender las partes de configuraciones, en fin)
    llegue al mismo problema que tu, no me funcionan los test de JPAProductDaoTest.java, con los mismos problemas que mencionas aca, solo que aun asi no me funcionan
    espero poder encontrar una respuesta pronto en algun lado

    Responder
    1. mvcarrillo Autor

      Buenas, tras hacer el cambio creo recordar que debes borrar los ficheros de los directorios classes para que el cambio sea efectivo al volver a probar.

      El problema parece ser un bug de la versión de Spring, al renombrar el persistence-unit les estamos dando nombres distintos para el ámbito de test, así que si has sustituido la referencia en la configuración y todo tu código debe funcionar a menos que en classes te haya quedado una copia del fichero anterior.

      Responder
  2. Juan

    Buenas,
    Yo estoy siguiendo ese mismo tutorial y me he quedado precisamente en ese punto, he probado esto mismo y sigue dandome error los tests:

    -org.springframework.beans.factory.BeanCreationException: Error creating bean with name ‘entityManagerFactory’ defined in class path resource [test-context.xml]:
    Invocation of init method failed; nested exception is java.lang.IllegalStateException: Conflicting persistence unit definitions for name ‘springappPUtest’:
    – en worksp/springapp/target/classes y – worksp/springapp/target/test-classes

    Ahora ademas, al probar a quitar el ultimo archivo e intentar arrancarlo como springappPU (en vez de springappPUtest ) ni siquera me finaliza el test, no entiendo que puede estar pasando, a no ser que la app no vea la BD…

    ME podrian decir como asegurarse que se ven, la base de datos (mysql) y la app?
    Uso el eclipse (siguiendo tutorial) y mysql (a traves de XAMPP) no se si puede tener algo que ver.

    saludos y gracias

    Responder
    1. mvcarrillo Autor

      ¿Has borrado el directorio classes tras unificar ambos persistence.xml en uno solo?… recuerda que se trata de unificar ambos ficheros, no de cambiar simplemente el nombre.

      Perdona que ahora mismo no te pueda ayudar más, pero tengo este ejemplo un tanto olvidado 🙁

      Responder

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.