【问题标题】:JpaRepository not implemented/injected when in separate package from componentscanJpaRepository 在与 componentscan 分开的包中时未实现/注入
【发布时间】:2014-10-25 21:05:44
【问题描述】:

当 Spring 数据位于与包含 @ComponentScan 的主类不同的包中时,我有一个 JpaRepository 接口没有被实现(或注入?)。

我的包结构(只是为了演示错误):

- org.demo.jpa.myapp
    Application.java
- org.demo.jpa.repo
    MyDomainObject.java
    MyRepository.java

MyRepository.java

public interface MyRepository extends JpaRepository<MyDomainObject, Long> { }

Application.java

@Configuration
@ComponentScan(basePackages="org.demo.jpa")
@EnableAutoConfiguration
public class Application {

    public static void main(String[] args) {
        ApplicationContext context = SpringApplication.run(Application.class, args);        
        if (context.getBean(MyRepository.class) == null){
            throw new NullPointerException("repo was not initialized!");
        }
    }                
}

例外

Exception in thread "main" 2014-09-01 11:20:26.336  INFO 6156 --- [           main] org.demo.jpa.myapp.Application           : Started Application in 2.824 seconds (JVM running for
 3.362)
2014-09-01 11:20:26.339  INFO 6156 --- [       Thread-1] s.c.a.AnnotationConfigApplicationContext : Closing org.springframework.context.annotation.AnnotationConfigApplicationContex
t@5d50b632: startup date [Mon Sep 01 11:20:23 EDT 2014]; root of context hierarchy
org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [org.demo.jpa.repo.MyRepository] is defined
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:319)
    at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:985)
    at org.demo.jpa.myapp.Application.main(Application.java:17)

当 MyRepository 和 MyDomainObject 与 Application 类在同一个包中时,不会引发此错误

这是使用 spring-boot-starter-parent 1.1.5.RELEASE 和 spring-boot-starter-data-jpa。

【问题讨论】:

    标签: spring-boot spring-data-jpa


    【解决方案1】:

    这可能是预期的行为(请参阅docs here)。包含@EnableAutoConfiguration 的包实际上是@EnableJpaRepostories@EntityScan 的默认猜测值。如果这些包与主 autoconfig 包分离,您将需要这两个包。

    【讨论】:

    • 所以这与@ComponentScan的basePackages无关?
    • 我添加了 @EnableJpaRepositories(basePackages="org.demo.jpa.repo"),但现在我得到了 org.demo.jpa.repo.MyDomainObject 的“非托管类型”异常。我是否必须创建自己的 EntityManagerFactory 并指定要扫描的包?
    • 不,您还需要@EntityScan(根据我上面链接到的文档)。
    • 我通常建议将 Application 类保留在应用程序的根目录中。这样你就可以避免大量的显式配置,因为一切都是透明的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-01-23
    • 2021-11-03
    • 2017-10-19
    • 1970-01-01
    • 2015-04-12
    • 1970-01-01
    相关资源
    最近更新 更多