【问题标题】:Autowired issue with Spring testSpring测试的自动装配问题
【发布时间】:2011-12-29 01:25:15
【问题描述】:

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

原因: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 菲尔(价值=主要)} 在 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,我添加了一个限定符,检查了 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"})

现在真的很迷茫……

【问题讨论】:

    标签: spring testing jpa junit autowired


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      我建议在您的服务实现类上使用 @Repository 或 @Service - 但不能同时使用两者。

      您可能会遇到与未触发事务相关的另一个问题 - 此处:https://jira.springsource.org/browse/SPR-5082 - 一种解决方法是在应用程序上下文 xml 定义文件中定义 bean。

      【讨论】:

      • 在设置 @ContextConfiguration 以便它从 C: 驱动器加载上下文文件后,我现在得到以下异常:Absent Code attribute in method that is not native or abstract in class file javax/ejb/TransactionAttributeType
      • 由于某种原因它不会让我发布整个 pom,但这里有两个在这里发挥作用:&lt;groupId&gt;commons-dbcp&lt;/groupId&gt; &lt;artifactId&gt;commons-dbcp&lt;/artifactId&gt; &lt;version&gt;1.4&lt;/version&gt; &lt;/dependency&gt; &lt;dependency&gt; &lt;groupId&gt;javax&lt;/groupId&gt; &lt;artifactId&gt;javaee-api&lt;/artifactId&gt; &lt;/dependency&gt;
      • Absent code ... 意味着您拥有 api,但缺少 jee 实现。您想为您的应用程序使用哪个应用程序服务器?对于 jboss 它是例如依赖项:org.jboss.specjboss-javaee-6.01.0.0.Finalpom提供
      【解决方案3】:

      至少在您的实现类中没有属性“entityManagerFactory”。不确定这是否已经导致问题。 你能分享完整的堆栈跟踪(包括嵌套异常)和 *context.xml 文件的更多 sn-ps 吗?

      编辑:看看这个答案:Testing against Java EE 6 API

      【讨论】:

      • 这里是整个 context.xml 文件:
      • 它不会让我发布整个 xml 并且我无法在接下来的 8 小时内发布答案......我把它拿出来了。感谢您指出这一点,但我仍然遇到同样的错误。实际上,我现在决定只指向我的 c: 驱动器上的上下文文件,我现在收到一条不同的错误消息 - 请参阅对 Jhakki 的回复。
      猜你喜欢
      • 1970-01-01
      • 2011-06-10
      • 1970-01-01
      • 2016-03-29
      • 2011-04-09
      • 2018-05-08
      • 2011-06-19
      • 1970-01-01
      • 2018-04-15
      相关资源
      最近更新 更多