Вопрос

Я хотел бы использовать две разные реализации для DAO с TestFramework Spring.

src.main.java

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

Весенний тест в:

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

А вот ошибка:

вызвано: java.lang.illegalstateException: Аннотационное имя бобов 'userdao' для класса Bean [jpadao.userdao] конфликты с существующими, Не совместимое определение бобов того же Имя и класс [JPAADAO.USERDAO]

Я уже пытался переопределить автосистему с помощью квалификации, например.:

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

, а затем в проводке теста с

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

Но ошибка сохраняется.

Два вопроса:

  1. Как эта проблема может быть решена с конфигурацией на основе аннотации?
  2. Как я могу запустить тесты без перевозок и аннотаций?
Это было полезно?

Решение

Вы используете бобы без имен, чтобы пружина постаралась придумать имя, это имя может быть основано на аннотации @Component, которое вы предположительно имеете в своем классе, но это также может быть версию вашего CAMELCASEНеквалифицированное название класса вашего компонента (в обоих случаях они получили равным, и это вызывает пружину к объекту).

Кроме того, кажется, что вы смешиваете сканирование компонентов и конфигурацию XML таким образом, чтобы мне немного раскрыты.

Есть много путей этого, но наиболее чисто вы будете использовать только одну фасоль, реализующий контракт, который вы пытаетесь FullFil.Если вам нужны разные реализации, вы должны дать им разные и более дискривные имена:

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

Это даст вам более полезную регистрацию, даже если имена бобов никогда не используются, потому что вы полагаетесь на автоматическую проводку.

Другие советы

  1. делают то, что предложил Iwein: назовите свои классы реализации лучше (например, hibernateuserdao и jpauserdao);Или укажите уникальное имя компонента с помощью аннотации @Component или @Repository на ваших классах реализации USERDAO.
  2. Вы не можете запускать тесты без перевоза.Смотрите эту проблему JIRA для деталей: https://jira.springsource.org/browse/spr-6050
  3. С уважением,

    Сэм (автор весной TestContext Framework)

    P.S.Нет, проблема, которую вы столкнулись, не связаны с SPR-4524.

Вы можете попробовать вводить зависимость от имени с использованием аннотации @Resource.Вам придется давать имена (IDS) к бобам или использовать по умолчанию, что является неквартизированным неквалифицированным классом.

У меня сейчас и работает!Однако я не верю, что это лучшая практика.Я просто исключил путь нежелательных DAO, написав в AppContext.xml:

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

Любые предложения?Может ли этот вопрос быть связан с http://jira.springframework.org/browse/spr-4524 ?

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top