我花了几个小时试图弄清楚为什么我的代码会引发以下异常。在这一点上,我希望有人会比我更聪明,因为我失去了希望...;)


  由以下原因引起:org.springframework.beans.factory.NoSuchBeanDefinitionException:未找到类型为[com.ls.forecast.jpa.ForecastElementService]的匹配bean作为依赖项:至少需要1个有资格作为此依赖项的自动装配候选的bean。依赖项注释:{@ org.springframework.beans.factory.annotation.Autowired(required = 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"/>




最后是故障测试类-ForecastElementService变量是引发异常的类。

@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放在我的maven项目的资源(测试)文件夹中并编辑为:

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


现在真的很困惑...

最佳答案

我需要将注释配置和组件扫描添加到applicationContext.xml,以便它可以正确地“自动装配” bean。完成此操作后,我就可以摆脱测试类(forecastElementService)中的变量。

08-04 16:59