自动装配bean不工作上下文:组件扫描

时间:2014-04-11 18:21:55

标签: java spring

玩一个原型。我有一个自动装配JPARepository的测试类

@ContextConfiguration("classpath:appContext-test.xml")
@Transactional
public class PersonRepositoryTest extends AbstractTransactionalJUnit4SpringContextTests {
    private static Logger logger = LoggerFactory.getLogger(PersonRepositoryTest.class);

    @Autowired
    PersonRepository personRepository;

我的appContext-test.xml在这个

中工作正常
<jpa:repositories base-package="com.mycompany.rd.misf.repository" /> 

但是当我想要了解春天时,我认为这也可能有效。所以我注释掉了jpa:repositories标签并用以下内容补充了我的组件扫描:

<context:component-scan base-package="com.mycompany.rd.misf.model,com.mycompany.rd.misf.repository" />

我的存储库使用@Repository注释

@Repository
public interface PersonRepository extends JpaRepository<Person, Long> {
    public List<Person> findByFirstNameAndLastName(String firstName,
            String lastName);

    @Query("select p from Person p where p.firstName = :firstName or p.lastName = :lastName")
    public List<Person> findByFirstNameOrLastName(
            @Param("firstName") String firstName,
            @Param("lastName") String lastName);

    public Page<Person> findAll(Pageable pageable);
}

但我得到例外:

  

无法自动装配字段:   com.mycompany.rd.misf.repository.PersonRepository   com.mycompany.rd.misf.repository.PersonRepositoryTest.personRepository;   嵌套异常是   org.springframework.beans.factory.NoSuchBeanDefinitionException:没有   合格的bean类型   找到[com.mycompany.rd.misf.repository.PersonRepository]   依赖:预计至少有1个bean有资格成为autowire   这种依赖的候选人。依赖注释:   {@ org.springframework.beans.factory.annotation.Autowired(所需=真)}

为什么这不起作用?

我已在appContext-text.xml文件中设置。

  

任何帮助表示感谢。

此致

1 个答案:

答案 0 :(得分:4)

Spring JPA文档说明了以下关于jpa:repositories

的内容
  

[...] 指示Spring扫描   com.acme.repositories 及其扩展接口的所有子包   存储库或其子接口之一。对于找到的每个接口,   基础设施注册特定于持久性技术   FactoryBean用于创建处理调用的相应代理   的查询方法。每个bean都以bean名称注册   是从接口名称派生的,因此是UserRepository的接口   将在userRepository下注册。 base-package属性   允许使用通配符,以便您可以定义扫描模式   包。

所以

<jpa:repositories base-package="com.mycompany.rd.misf.repository" /> 

扫描基础包及其所有子包,以扩展Repository JpaRepository所做的类,因此PersonRepository接口会创建一个bean。

这是JPA特有的行为。

<context:component-scan base-package="com.mycompany.rd.misf.model,com.mycompany.rd.misf.repository" />

您告诉Spring扫描指定的包及其(子)子包,以查找用@Component注释的组件及其特性。如果找到任何带注释的,Spring应该为它们创建一个bean定义。

在您的情况下,它会找到@Component@Repository的特化,但它是一个接口,因此它不会注册bean定义。在这种情况下,它完全不了解JPA。