玩一个原型。我有一个自动装配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文件中设置。
任何帮助表示感谢。
此致
我
答案 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。