Spring boot 2.1.4 Autowired在启动期间运行良好,但在创建新的Pojo实例时效果不佳,请参见下面的代码
@Component
public class Pojo {
private ConfigController c;
@Autowired
public void setProperty(ConfigController cp) { this.c = cp; }
public Pojo () {};
public String getVal() { return c.geItem1(); }
}
@Configuration
@Component
public class ConfigController {
private String item1;
private String item2;
public ConfigController () {};
public String geItem1()
{ return this.item1; }
public void setItem1(String s)
{ this.item1 = s; }
@SpringBootApplication
public class SpringBootConsoleApplication implements CommandLineRunner {
@Autowired
private ConfigController c;
public static void main(String[] args) {
SpringApplication.run(SpringBootConsoleApplication.class, args);
}
@Override
public void run(String... args) {
Pojo p = new Pojo();
System.println(p.getVal()); // Runtime error here with java.lang.NullPointerException
}
}
p似乎已实例化,但是@Autowired似乎没有用。
任何提示我做错了吗?
附加说明 谢谢您的回复-我知道pojo可以在Spring实例化-感谢您的澄清,我现在明白了。话虽如此,我对RestController还是有完全相同的问题-见下文。 Spring会自动将p映射到新的Pojo,但此pojo中的配置未自动连线。
@RestController
public class MyController {
@GetMapping("/my-end-point")
OtherPojo getOtherPojo(@RequestBody Pojo p)
{
System.println(p.getVal()); // Runtime error here with java.lang.NullPointerException
// ... more code
}
答案 0 :(得分:0)
您必须考虑的事情是何时要使用spring依赖注入 总是让spring容器通过@Autowire或从'SpringContext'创建对象,否则将无法工作。要在这里解决您的问题,您还必须使用@Autowire在run方法中注入Pojo。
答案 1 :(得分:0)
您的方法不正确。
关于您的第一个问题-第1部分:
您正在自己创建new Pojo()
。所以不会自动注入吗?我想你已经明白了。
第2部分:
您正在从HTTP请求正文而不是从容器创建Pojo
。这意味着您有一个具有Pojo结构的Json请求,并且您希望它可以自动装配。返回基础:自动装配仅在您自动装配或注入组件或父对象然后注入子组件时起作用。
更正您的Json请求!
答案 2 :(得分:0)
我想我现在明白了-IoC将在启动时跟踪在IoC容器中创建的组件-其他所有内容都不是 谢谢你们 伊安(Ioan)