繁体   English   中英

SpringBoot:Autowired 在配置中工作,但在控制器中返回 null

[英]SpringBoot: Autowired works in Configuration, but returns null in Controller

我的问题:我已经为我的模型管理器创建了一个 Singleton Bean。 但是,尝试在我的控制器中自动装配它会导致空指针。 然而,在我的配置中,同一个 Bean 的自动装配工作得很好。

在这一点上我应该注意,这不是我在这个项目中制作的第一个单例 Bean; 据我所知,我和其他人一样。 所有 Autowire 正确。 这就是我现在被难住的主要原因。

编码:

主应用程序位于“项目”包下,因此所有其他包都是该包的子包。 为简洁起见,我选择省略导入,但所有内容都按原样导入。

配置

package project.config

@Configuration
public class BootstrapConfig {
    
    @Bean
    @Scope("singleton")
    public ThingManager thingManager() {
        return new thingManager();
    }

   @Autowired
   private ThingManager manager;


   @PostConstruct
   public void initialize() {
     manager.setup() //This works fine.

  }
}

经理

package project.model

public class ThingManager {

   private HashMap<String, Thing> things;

   public ThingManager() {
     things = new HashMap<String, Thing>();
   }

   public void setup() {
     //Do setup Things
   }

   public Thing getThing(String input) {
     return things.get(input);
   }

}

控制器

package project.controller

@RestController
@RequestMapping("/api/things")
public class ThingController {

  @Autowired
  ThingManager manager; //This is null

  private Thing thing;

  public ThingController() {
    this.thing = manager.getThing("test"); //This then throws NullPointer.
  }

  @GetMapping("/")
  public ResponseEntity<Thing> showThing() {
    return ResponseEntity.ok(thing);
  }
}

我尝试过的:我尝试将 ThingManager 标记为@Component @Scope(value = "singleton")而不是手动设置 Bean(所以我删除了配置中的@Bean代码块); 结果是一样的; 配置可以完美地自动装配它,但控制器不能。

我已经在这里查看了无数关于这个主题的帖子,但大多数似乎是关于有人忘记将他们 Autowire 所在的类标记为组件或类似的。 也许我忽略了与我的问题的相似之处; 很难说。

Spring 只能在创建对象后自动装配字段(调用构造函数),因此您正在访问尚未注入 ThingControler 的构造函数中的manager 在构造函数中使用manager的最简单方法是将其添加为构造函数参数而不是自动装配(Spring 将使用可用的 bean 作为参数):

// ... 
public class ThingController {

  private final Thing thing;

  public ThingController(ThingManager manager) {
    this.thing = manager.getThing("test");
  }
  // ...
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM