【问题标题】:Getting null for Autowired bean created using Java config为使用 Java 配置创建的 Autowired bean 获取 null
【发布时间】:2020-06-23 07:54:40
【问题描述】:

我正在 Spring Boot 中创建一个 REST 服务。我在配置类中创建一个 bean 并尝试通过自动连接在服务类中使用,但我总是得到空值,我也尝试过构造函数注入但没有工作。下面是代码,

主应用

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

REST 控制器

@RestController
@RequestMapping("/v1")
public class RestController {

    @Autowired
    private Service service;

服务

@Service
public class ServiceImpl implements Service {
    //This is the bean
    @Autowired
    private Record record;
    
    public ServiceImpl() {   //-----------------> tried injecting in constructor as well
        System.out.println(record); //-------------------> null
    }

配置类

@Configuration
public class AppConfig {
    
    @Bean
    public Record record() {
        return new Record("test");
    }
}

我注意到每当我从配置类中删除记录()时,我都会遇到以下错误

required a bean of type 'com.ns.service.Record' that could not be found

并且添加方法后不报错但返回null,这间接意味着record()被认为返回了所需的bean。 我找不到我做错了什么请指教。

项目文件夹结构

【问题讨论】:

  • 你能提供你的项目结构吗?如果您通过展开所有包来粘贴屏幕截图,效果会更好。
  • 当然是构造函数中的null。该字段只能在构建 bean 之后自动连接。因此,该字段将在对象构建后填充。

标签: java spring spring-boot spring-mvc spring-restcontroller


【解决方案1】:

我认为你在概念上所做的一切都是正确的

Spring 首先创建一个对象,然后才注入值(技术上在 bean 后处理器中完成):

所以试试这个:

@Service
public class ServiceImpl implements Service {
    //This is the bean
    @Autowired
    private Record record;
    
    public ServiceImpl() {   
        // here the record is null - not injected yet
        System.out.println(record); 
    }

    @PostConstruct
    public void checkThisOut() {
      // here print the record
    }

您说您也尝试过构造函数注入 - 它应该可以工作,因为 spring 必须向 bean (ServiceImpl) 的构造函数中注入一些东西,否则会失败。请出示代码sn-p

这在某种程度上可能是错误的(尽管从您的描述中听起来不是这样)是您必须将所有 @Configuration/@Service 注释类放在相同或相同的包中在您创建带有 @SpringBootApplication 注释的主类的包下方。它指示 spring boot 在哪里寻找 bean。

所以请确保你的班级遵守这条规则...

【讨论】:

  • @PostConstruct 有效,即使构造函数注入也有效,我可以再问一个问题,如果我想在构造函数中注入 List 失败,可能是什么问题
  • 是的,这就是我所怀疑的。告诉我你想在构造函数中注入列表的代码 - 考虑添加一个新问题并在此处发布一个链接,以便我可以跟踪它......我会尽力帮助......
  • 创建了单独的问题stackoverflow.com/q/62530742/2151491
猜你喜欢
  • 1970-01-01
  • 2016-12-05
  • 2019-11-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-19
相关资源
最近更新 更多