Проблема с автопроводкой в ​​тесте Spring - PullRequest
2 голосов
/ 15 ноября 2011

Я потратил часы, пытаясь выяснить, почему мой код выдает следующее исключение.На данный момент, я надеюсь, что кто-то может быть более умным, чем я, поскольку я теряю надежду ...;)

Причина: org.springframework.beans.factory.NoSuchBeanDefinitionException: Нет соответствиябин типа [com.ls.forecast.jpa.ForecastElementService] найден для зависимости: ожидается как минимум 1 бин, который квалифицируется как кандидат для автоматической передачи для этой зависимости.Аннотации зависимостей: {@ org.springframework.beans.factory.annotation.Autowired (обязательно = true), @ org.springframework.beans.factory.annotation.Quali fier (value = main)} в org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoSuchBeanDefinitionException (DefaultListableBeanFactory.java:924) при org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency (DefaultListableBeanFactory.java:793) в org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency (DefaultListableBeanFactory.Java: 707) в org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor $ AutowiredFieldElement.inject (AutowiredAnnotationBeanPostProcessor.java:480)

я посмотрел много тем без удачи.Кажется, все они настроены так же, как и мои.Я добавил @Service для реализации службы, добавил Qualifier, проверил, что ForecastElementServiceImpl действительно реализовал интерфейс ForecastElementService.

Интерфейс службы:

public interface ForecastElementService {

Collection<ForecastElement> retrieve(String date);
Collection<ForecastElement> retrieve();
}

Реализация интерфейса:

@Stateless
@TransactionAttribute(TransactionAttributeType.REQUIRED)
@Repository("forecastElementService")
@Service
public class ForecastElementServiceImpl implements ForecastElementService {

@PersistenceContext
protected EntityManager em;

@Override
@Cacheable("forecastElements")
public Collection<ForecastElement> retrieve(String date) {
    String sql = null;
    if(date != null) {
        sql = " SELECT fe FROM ForecastElement fe JOIN FETCH fe.forecastType WHERE ?1 between fe.startDate and fe.endDate";
    } else {
        sql = " SELECT fe FROM ForecastElement fe JOIN FETCH fe.forecastType";
    }
    final TypedQuery<ForecastElement> query = em.createQuery(sql, ForecastElement.class);

    return query.getResultList();
}

@Override
@Cacheable("forecastElements")
public Collection<ForecastElement> retrieve() {

    return retrieve(null);
}

}

context.xml:

<bean id="forecastElementService" class="com.ls.forecast.jpa.ForecastElementServiceImpl">
<property name="entityManagerFactory" ref="entityManagerFactory"/>

И, наконец, класс теста неисправности - переменнаяcastElementService является той, которая выдает исключение.

@Repository
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration({"*-context.xml"})
public class ModelJpaTest extends AbstractTransactionalJUnit4SpringContextTests {

//final Logger logger = LoggerFactory.getLogger(ModelJpaTest.class);

@Autowired
protected ForecastElementService forecastElementService;

@Autowired
@Qualifier("basicDataSource")
@Override
public void setDataSource(DataSource dataSource) {
    super.setDataSource(dataSource);
}

@Test
public void LoadModelTest() {
    assertNotNull("forecastElementService is null", forecastElementService);
    Collection<ForecastElement> elements = forecastElementService.retrieve();
    assertTrue(elements.size() > 0);
}

}

Буду очень признателен за любые идеи или помощь!

См. @ContextConfiguration ... Если я помещу ModelJpaTest-context.xml в папку ресурсов (test) моего проекта maven и отредактируюна:

@ContextConfiguration({"/ModelJpaTest-context.xml"})

Действительно смущен сейчас ...

Ответы [ 3 ]

1 голос
/ 10 января 2012

Мне нужно добавить конфигурацию аннотации и сканирование компонента в applicationContext.xml, чтобы он правильно "связывал" компонент.Как только это было сделано, я смог избавиться от переменной в тестовом классе (castElementService).

0 голосов
/ 15 ноября 2011

Я бы предложил использовать либо @Repository, либо @Service - но не оба вместе - в вашем классе обслуживания.

Вы можете столкнуться с другой проблемой, связанной с транзакциями, которые не запускаются - здесь: https://jira.springsource.org/browse/SPR-5082 - обходной путь - определить bean-компоненты в XML-файле определения контекста приложения.

0 голосов
/ 15 ноября 2011

По крайней мере, в вашем классе реализации нет правильного entityManagerFactory. Не уверен, что это может вызвать проблемы. Можете ли вы поделиться полной трассировкой стека (включая вложенные исключения) и еще некоторыми фрагментами файла * context.xml?

РЕДАКТИРОВАТЬ: Посмотрите на этот ответ: Тестирование на Java EE 6 API

...