首页 > 解决方案 > 尝试@Autowire @Component 的异常

问题描述

尝试自动装配组件时出现 NoSuchBeanDefinitionException

org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.github.robertobatts.restapi.repository.OrderRepository' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}

这是我尝试自动装配的代码:

@CrossOrigin(origins = "*")
@RestController
@RequestMapping(value = "/order", produces = "application/json")
public class OrderController {

    @Autowired
    private OrderRepository repository;

...

}

这是组件:

@Component
public class OrderRepository extends InMemoryRepository<Order> {

    @Override
    protected void updateIfExists(Order original, Order updated) {
        original.setDescription(updated.getDescription());
        original.setCostInCents(updated.getCostInCents());
        original.setComplete(updated.isComplete());
    }

}

OrderRepository 使用的所有对象都是标准的 java 对象,没有 spring 注释。

以下是包的结构:

restapi
    SpringBootApplication.java
    controller
        OrderController.java
    repository
        OrderRepository.java

标签: springspring-boot

解决方案


请将您的@SpringBootApplication 注释类一级包向上移动。

注释本身包含@ComponentScan和...

如果未定义特定的包,则会从声明此注解的类的包中进行扫描。

来源:https ://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/context/annotation/ComponentScan.html


这些更改34ced93为我提供了预期的标准输出行,使用mvn clean spring-boot:run.

diff --git a/src/main/java/com/github/robertobatts/restapi/main/RestApiExampleApplication.java b/src/main/java/com/github/robertobatts/restapi/RestApiExampleApplication.java
similarity index 86%
rename from src/main/java/com/github/robertobatts/restapi/main/RestApiExampleApplication.java
rename to src/main/java/com/github/robertobatts/restapi/RestApiExampleApplication.java
index bc01db5..affb928 100644
--- a/src/main/java/com/github/robertobatts/restapi/main/RestApiExampleApplication.java
+++ b/src/main/java/com/github/robertobatts/restapi/RestApiExampleApplication.java
@@ -1,3 +1,3 @@
-package com.github.robertobatts.restapi.main;
+package com.github.robertobatts.restapi;

 import org.springframework.boot.SpringApplication;
diff --git a/src/main/java/com/github/robertobatts/restapi/repository/OrderRepository.java b/src/main/java/com/github/robertobatts/restapi/repository/OrderRepository.java
index b356e74..554610a 100644
--- a/src/main/java/com/github/robertobatts/restapi/repository/OrderRepository.java
+++ b/src/main/java/com/github/robertobatts/restapi/repository/OrderRepository.java
@@ -1,4 +1,6 @@
 package com.github.robertobatts.restapi.repository;

+import javax.annotation.PostConstruct;
+
 import org.springframework.stereotype.Repository;

@@ -8,4 +10,9 @@ import com.github.robertobatts.restapi.domain.Order;
 public class OrderRepository extends InMemoryRepository<Order> {

+       @PostConstruct
+       private void test() {
+               System.out.println("OrderRepository ready.");
+       }
+
        @Override
        protected void updateIfExists(Order original, Order updated) {

推荐阅读