簡體   English   中英

使用@ComponentScan時,Spring Boot在兄弟包中找不到JpaRepositories或使用@EnableJpaRepositories時無法初始化它們

[英]Spring boot doesn't find JpaRepositories in sibling-package when using @ComponentScan or can't initialize them when using @EnableJpaRepositories

我有一個由多個模塊組成的Maven項目。 其中三個模塊是

  • “項目核心”(包含模型類)
  • “項目數據”(包含Spring Data JPA存儲庫)
  • “ project-spring”(包含具有REST控制器的主Spring Boot App)。

在啟動時,出現以下異常:

Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [org.foo.bar.data.OrderRepository] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {}

我知道默認情況下,Spring Boot Applications只在它們自己的子包中查找它們的子包,但是在這種情況下,bean在同級包中。 我已經嘗試將@ComponentScan({"org.foo.bar.data"})到Application類,但無濟於事。

使用@EnableJpaRepositories(basePackages = {"org.foo.bar.data"})引發

Caused by: java.lang.IllegalArgumentException: Not an managed type: class org.foo.bar.core.model.Order

我究竟做錯了什么?

目錄樹(已修剪)如下所示:

project
├── project-core
│   └── src
│       └── main
│           └── java
│               └── org
│                   └── foo
│                       └── bar
│                           └── core
|                               └── model
|                                   └── Order.java
├── project-data
│   └── src
│       └── main
│           └── java
│               └── org
│                   └── foo
│                       └── bar
│                           └── data
|                               └── OrderRepository.java
│
└── project-spring
    └── src
        └── main
            └── java
                └── org
                    └── foo
                        └── bar
                            └── spring
                                └── Application.java

OrderRepository:

public interface OrderRepository extends JpaRepository<Order, Integer> {
    List<Order> findByDeliveryOverview(DeliveryOverview deliveryOverview);
    List<Order> findByDeliveryOverviewAndCustomer(DeliveryOverview deliveryOverview, Customer customer);
}

應用程序

@SpringBootApplication
@ComponentScan({"org.foo.bar.data"})
public class Application {
    private static final Logger log = LoggerFactory.getLogger(Application.class);

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

主要問題是您的結構。

要掃描實體,您需要在應用程序類上使用@EntityScan並啟用存儲庫,您需要@EnableJpaRepositories

@SpringBootApplication
@EntityScan({"org.foo.bar.core.model"})
@EnableJpaRepositories(basePackages = {"org.foo.bar.data"})
public class Application { ... }

但是我建議將Application類移到org.foo.bar ,然后只需要@SpringBootApplication因為它將從該目錄開始掃描。

注釋OrderRepository@Repository和刪除此聲明{"org.foo.bar.data"}@ComponentScan

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM