Pregunta

Me gustaría usar dos implementaciones diferentes para un DAO con el testFramework de Spring.

src.main.java

.businessobjects
   \-User.java
.dao
   \-IUserDAO.java
.daojpa
   \-UserDAO.java
.daohibernate
   \-UserDAO.java

The Spring Testcase en:

src.test.java.base:

package base;

import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.transaction.annotation.Transactional;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("/hibernate-beans.xml")
@Transactional
public abstract class SpringTestCase {}

y aquí está el error:

causado por: java.lang.illegalStateException: Nombre del frijol especificado por la anotación 'Userdao' para la clase de frijoles [jpadao.userdao] Conflictos con existentes, definición de frijol no compatible de la misma Nombre y clase [JPAADAO.USERDAO]

Ya he intentado anular el Autowiring usando calificadores, por ejemplo:

<bean class="jpaadao.UserDAO">
    <qualifier value="jpaa"/>
</bean>
<bean class="jpadao.UserDAO">
    <qualifier value="jpa"/>
</bean>

y luego en el cableado de Testcase con

@Autowired
@Qualifier("jpa")
private IUserDAO userDAO;

pero el error persiste.

Dos preguntas:

  1. ¿Cómo se puede resolver este problema con la configuración basada en anotación?
  2. ¿Cómo puedo ejecutar las pruebas sin Autowiring y anotaciones?
¿Fue útil?

Solución

Está usando frijoles sin nombres para que la primavera intente llegar a un nombre, este nombre puede basarse en la anotación de @Component que presumiblemente tiene en su clase, pero también podría ser la versión camelcasada de suEl nombre de clase no calificado de su frijol (en ambos casos resultaría igual y que causa que el resorte se agote).

Además, parece que está mezclando el escaneo de componentes y la configuración XML de una manera que se ve un poco extraña para mí.

Hay muchas maneras de salir de esto, pero la mayoría de las que solo usaría un solo frijol que implementa el contrato que está intentando fullfil.Si necesita diferentes implementaciones, debe darles nombres diferentes y más discriptivos:

<bean id="jpaUserRepository" class="..JpaUserRepository"/>

Esto le dará un registro más útil, incluso si los nombres de frijoles nunca se usan porque confía en el cableado automático.

Otros consejos

  1. Haga lo que sugirió IWEIN: Nombra mejor las clases de implementación (por ejemplo, HibernateUserdao y JPAUSERDAO);O especifique un nombre de frijol único a través de @Component o @Repository Annotation en sus clases de implementación de UserDao.
  2. Actualmente no puede ejecutar pruebas sin conjuntamente.Consulte este número de JIRA para obtener más información: https://jira.springsource.org/browse/spr-6050
  3. Saludos,

    SAM (Autor del Framework Spring TestContext)

    P.s.No, el problema que enfrenta no está relacionado con SPR-4524.

Puede intentar inyectar el nombre de dependencia con la anotación de @Resource.Tendrá que dar nombres (ID) a los frijoles o usar el valor predeterminado, que es el nombre de clase no calificado no calificado.

¡Lo tengo en funcionamiento ahora!Sin embargo, no creo que esto sea la mejor práctica.Simplemente excluí el camino del Daos no deseado escribiendo en AppContEx.xml:

   <context:component-scan base-package="test">
        <context:exclude-filter type="regex" expression="test\.daohibernate.*"></context:exclude-filter>
    </context:component-scan>

¿Alguna sugerencia?¿Podría este problema estar relacionado con http://jira.springframework.org/browse/spr-4524 ?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top