Domanda

Vorrei utilizzare due diverse implementazioni per un DAO con il test di primavera.

src.main.java

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

The Spring Tentacase in:

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 {}
.

Ed ecco l'errore:

.

causato da: java.lang.illegalstateException: Nome bevaggio specificato di annotazione 'UserDao' per classe di fagioli [JPADAO.USERDAO] conflitti con esistenti, Definizione del bean non compatibile dello stesso Nome e classe [JPAADA.USERDAO]

Ho già provato a ignorare l'AutoWiring utilizzando qualificatori, ad esempio.:

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

e poi nel cablaggio di prova con

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

Ma l'errore persiste.

Due domande:

    .
  1. Come può essere risolto questo problema con la configurazione basata sulla annotazione?
  2. Come posso eseguire test senza Autowiring e annotazioni?
È stato utile?

Soluzione

stai usando i fagioli senza nomi in modo che la primavera proverà a trovare un nome, questo nome potrebbe essere basato sull'annotazione @Component che presumibilmente hai sulla tua classe, ma potrebbe anche essere la versione cammellata del tuoIl nome della classe non qualificato del tuo fagiolo (in entrambi i casi si spegnerà uguale e che causa la molla all'oggetto).

Inoltre, sembra che tu stia mescolando la scansione dei componenti e la configurazione XML in un modo che sembra un po 'strano a me.

Ci sono molti modi per uscire, ma il più pulito useresti solo un singolo fagiolo implementazione del contratto che stai cercando di fullfil.Se hai bisogno di diverse implementazioni, dovresti dare loro nomi diversi e più distrattivi:

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

Questo ti darà una registrazione più utile, anche se i nomi di fagioli non vengono mai utilizzati perché si affida al cablaggio automatico.

Altri suggerimenti

    .
  1. Fai ciò che suggeriva Iwein: nomina meglio le tue lezioni di implementazione (ad esempio, ibernateuserdao e JPauserdao);o specificare un nome di bean unico tramite l'annotazione @Component o @Repository sulle classi di implementazione UserDao.
  2. Non è possibile eseguire i test senza Autowiring.Vedi questa questione Jira per i dettagli: https://jira.springsource.org/browse/spr-6050
  3. Saluti,

    Sam (Autore del framework TestContext Spring)

    P.S.No, il problema che stai affrontando non è correlato a SPR-4524.

È possibile provare a iniettare la dipendenza da nome utilizzando l'annotazione @Resource.Dovrai dare nomi (IDS) ai fagioli o utilizzare il valore predefinito, che è il nome di classe non qualificato non identificato.

L'ho capito e correndo ora!Tuttavia, non credo che questa sia la migliore pratica.Ho semplicemente escluso il percorso dei daos indesiderati scrivendo in appcontext.xml:

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

Qualche suggerimento?Questo problema potrebbe essere correlato a http://jira.springframework.org/browse/spr-4524 ?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top