[英]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.