@Autowired 依赖项具有空成员
@Autowired dependency has null members
我的配置class:
@Configuration
public class TimeOutConfig {
@Value("${value1}")
private int value1;
@Value("${value2}")
private int value2;
@Bean()
User boTimeOut() {
System.out.println("In BOTimeOutConfig");
BeanTest b1 = new BeanTest(value1, value2);
User u1 = new User(b1);
return u1;
}
@Value("${value3}")
private int value3;
@Value("${value4}")
private int value4;
@Bean(name = "BSETimeout")
User getBSEUser() {
System.out.println("In BSETimeOutConfig");
User u2 = new User( new BeanTest(value3, value4));
return u2;
}
}
BeanTest Class:
@Component
public class BeanTest {
private int v1;
private int v2;
BeanWebClient b1;
public BeanTest(){}
public BeanTest(int v1, int v2){
this.v1=v1;
this.v2=v2;
beanWebClient();
}
public BeanWebClient beanWebClient() {
//System.out.println("In BeanTest class beanWebClient() method execution v1 and v2: "+v1+v2);
b1 = new BeanWebClient(v1,v2);
System.out.println("In BeanTest class beanWebClient() method execution v1 and v2: "+b1.getV1()+" "+b1.getV2());
return b1;
}
public void message()
{
b1.webClientMessage();
//System.out.println("V1= "+v1+" V2= "+v2);
}
}
BeanWebClientClass:
@Component
public class BeanWebClient {
private int v1;
private int v2;
public BeanWebClient(int v1, int v2){
this.v1=v1;
this.v2=v2;
System.out.println("Received from BeanTest "+v1+" "+v2);
}
public BeanWebClient(){
}
public int getV1() {
return v1;
}
public int getV2() {
return v2;
}
public void webClientMessage(){
System.out.println("In BeanWebClient class, printing from autowired dependency "+v1+" "+v2);
}
}
我的用户class:
@Component
public class User {
@Autowired
private BeanTest beanTest;
public User(BeanTest beanTest){
this.beanTest=beanTest;
}
public void message()
{
beanTest.message();
}
public User() {
//System.out.println("user create... hashCode :" + this.hashCode());
}
}
最后,我的服务class:
@Service
public class BeanService {
@Autowired
@Qualifier("boTimeOut")
private User boUser;
@Autowired
@Qualifier("BSETimeout")
private User bseUser;
public void printBO()
{
boUser.message();
}
public void printBSE()
{
bseUser.message();
}
}
我试图了解组件和自动装配依赖项在 spring 引导中是如何工作的。在我的用户 class 中,自动装配的 BeanTest class 在配置期间被初始化——所有必要的打印语句都被执行。但是当我调用服务的函数 class 时,自动装配的用户依赖项对于 beanTest 及其成员为 null。与此相反,当我只是在我的用户 class 中创建 BeanTest 对象时,一切都按预期工作。这就是我的意思:
@Component
public class User {
BeanTest beanTest;
public User(BeanTest beanTest){
this.beanTest=beanTest;
}
public void message()
{
beanTest.message();
}
public User() {
//System.out.println("user create... hashCode :" + this.hashCode());
}
}
我有点理解用户 class 中自动装配的 bean 从容器中获取是空的。由于我在我的服务 class 中自动装配特定的用户依赖项,我不明白为什么它不起作用。
有人可以解释一下我是否以及如何将 BeanTest class 正确地自动连接到用户 class 中。
抱歉有这么多代码文件。
产出
这是我在没有 @Autowire
的情况下手动创建 BeanTest 对象时得到的输出
In BOTimeOutConfig
Received from BeanTest 10 20
In BeanTest class beanWebClient() method execution v1 and v2: 10 20
In BSETimeOutConfig
Received from BeanTest 30 40
In BeanTest class beanWebClient() method execution v1 and v2: 30 40
2021-11-13 14:37:58.161 WARN 404383 --- [ main] JpaBaseConfiguration$JpaWebConfiguration : spring.jpa.open-in-view is enabled by default. Therefore, database queries may be performed during view rendering. Explicitly configure spring.jpa.open-in-view to disable this warning
2021-11-13 14:37:58.613 INFO 404383 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8080 (http) with context path ''
2021-11-13 14:37:58.622 INFO 404383 --- [ main] c.paytmmoney.errordb.ErrordbApplication : Started ErrordbApplication in 4.04 seconds (JVM running for 4.379)
2021-11-13 14:38:07.768 INFO 404383 --- [nio-8080-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring DispatcherServlet 'dispatcherServlet'
2021-11-13 14:38:07.768 INFO 404383 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Initializing Servlet 'dispatcherServlet'
2021-11-13 14:38:07.769 INFO 404383 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Completed initialization in 1 ms
In /test method
In BeanWebClient class, printing from autowired dependency 10 20
In /test method
In BeanWebClient class, printing from autowired dependency 30 40
当我自动装配 BeanTest Class 这是输出:
In BOTimeOutConfig
Received from BeanTest 10 20
In BeanTest class beanWebClient() method execution v1 and v2: 10 20
In BSETimeOutConfig
Received from BeanTest 30 40
In BeanTest class beanWebClient() method execution v1 and v2: 30 40
2021-11-13 14:40:36.072 WARN 404724 --- [ main] JpaBaseConfiguration$JpaWebConfiguration : spring.jpa.open-in-view is enabled by default. Therefore, database queries may be performed during view rendering. Explicitly configure spring.jpa.open-in-view to disable this warning
2021-11-13 14:40:36.585 INFO 404724 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8080 (http) with context path ''
2021-11-13 14:40:36.596 INFO 404724 --- [ main] c.paytmmoney.errordb.ErrordbApplication : Started ErrordbApplication in 4.353 seconds (JVM running for 4.75)
2021-11-13 14:40:45.081 INFO 404724 --- [nio-8080-exec-2] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring DispatcherServlet 'dispatcherServlet'
2021-11-13 14:40:45.081 INFO 404724 --- [nio-8080-exec-2] o.s.web.servlet.DispatcherServlet : Initializing Servlet 'dispatcherServlet'
2021-11-13 14:40:45.082 INFO 404724 --- [nio-8080-exec-2] o.s.web.servlet.DispatcherServlet : Completed initialization in 1 ms
In /test method
2021-11-13 14:40:45.204 ERROR 404724 --- [nio-8080-exec-2] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is java.lang.NullPointerException] with root cause
java.lang.NullPointerException: null
at com.paytmmoney.errordb.repository.BeanTest.message(BeanTest.java:42) ~[main/:na]
at com.paytmmoney.errordb.repository.User.message(User.java:22) ~[main/:na]
at com.paytmmoney.errordb.service.BeanService.printBO(BeanService.java:21) ~[main/:na]
我正在使用休息控制器调用服务中的函数 class。
谢谢!!!
鉴于您正在 TimeOutConfig
中自行创建 BeanTest
和 User
实例,请删除 [=] 中的所有 @Component
和 @Autowired
注释13=]、BeanWebClient
和 User
如下:
public class BeanTest {
private int v1;
private int v2;
BeanWebClient b1;
public BeanTest(){}
public BeanTest(int v1, int v2){
this.v1=v1;
this.v2=v2;
beanWebClient();
}
public BeanWebClient beanWebClient() {
//System.out.println("In BeanTest class beanWebClient() method execution v1 and v2: "+v1+v2);
b1 = new BeanWebClient(v1,v2);
System.out.println("In BeanTest class beanWebClient() method execution v1 and v2: "+b1.getV1()+" "+b1.getV2());
return b1;
}
public void message() {
b1.webClientMessage();
//System.out.println("V1= "+v1+" V2= "+v2);
}
}
public class BeanWebClient {
private int v1;
private int v2;
public BeanWebClient(int v1, int v2) {}
this.v1=v1;
this.v2=v2;
System.out.println("Received from BeanTest "+v1+" "+v2);
}
public BeanWebClient(){ }
public int getV1() {
return v1;
}
public int getV2() {
return v2;
}
public void webClientMessage(){
System.out.println("In BeanWebClient class, printing from autowired dependency "+v1+" "+v2);
}
}
public class User {
private BeanTest beanTest;
public User(BeanTest beanTest) {
this.beanTest=beanTest;
}
public User() {
//System.out.println("user create... hashCode :" + this.hashCode());
}
public void message() {
beanTest.message();
}
}
我的配置class:
@Configuration
public class TimeOutConfig {
@Value("${value1}")
private int value1;
@Value("${value2}")
private int value2;
@Bean()
User boTimeOut() {
System.out.println("In BOTimeOutConfig");
BeanTest b1 = new BeanTest(value1, value2);
User u1 = new User(b1);
return u1;
}
@Value("${value3}")
private int value3;
@Value("${value4}")
private int value4;
@Bean(name = "BSETimeout")
User getBSEUser() {
System.out.println("In BSETimeOutConfig");
User u2 = new User( new BeanTest(value3, value4));
return u2;
}
}
BeanTest Class:
@Component
public class BeanTest {
private int v1;
private int v2;
BeanWebClient b1;
public BeanTest(){}
public BeanTest(int v1, int v2){
this.v1=v1;
this.v2=v2;
beanWebClient();
}
public BeanWebClient beanWebClient() {
//System.out.println("In BeanTest class beanWebClient() method execution v1 and v2: "+v1+v2);
b1 = new BeanWebClient(v1,v2);
System.out.println("In BeanTest class beanWebClient() method execution v1 and v2: "+b1.getV1()+" "+b1.getV2());
return b1;
}
public void message()
{
b1.webClientMessage();
//System.out.println("V1= "+v1+" V2= "+v2);
}
}
BeanWebClientClass:
@Component
public class BeanWebClient {
private int v1;
private int v2;
public BeanWebClient(int v1, int v2){
this.v1=v1;
this.v2=v2;
System.out.println("Received from BeanTest "+v1+" "+v2);
}
public BeanWebClient(){
}
public int getV1() {
return v1;
}
public int getV2() {
return v2;
}
public void webClientMessage(){
System.out.println("In BeanWebClient class, printing from autowired dependency "+v1+" "+v2);
}
}
我的用户class:
@Component
public class User {
@Autowired
private BeanTest beanTest;
public User(BeanTest beanTest){
this.beanTest=beanTest;
}
public void message()
{
beanTest.message();
}
public User() {
//System.out.println("user create... hashCode :" + this.hashCode());
}
}
最后,我的服务class:
@Service
public class BeanService {
@Autowired
@Qualifier("boTimeOut")
private User boUser;
@Autowired
@Qualifier("BSETimeout")
private User bseUser;
public void printBO()
{
boUser.message();
}
public void printBSE()
{
bseUser.message();
}
}
我试图了解组件和自动装配依赖项在 spring 引导中是如何工作的。在我的用户 class 中,自动装配的 BeanTest class 在配置期间被初始化——所有必要的打印语句都被执行。但是当我调用服务的函数 class 时,自动装配的用户依赖项对于 beanTest 及其成员为 null。与此相反,当我只是在我的用户 class 中创建 BeanTest 对象时,一切都按预期工作。这就是我的意思:
@Component
public class User {
BeanTest beanTest;
public User(BeanTest beanTest){
this.beanTest=beanTest;
}
public void message()
{
beanTest.message();
}
public User() {
//System.out.println("user create... hashCode :" + this.hashCode());
}
}
我有点理解用户 class 中自动装配的 bean 从容器中获取是空的。由于我在我的服务 class 中自动装配特定的用户依赖项,我不明白为什么它不起作用。 有人可以解释一下我是否以及如何将 BeanTest class 正确地自动连接到用户 class 中。 抱歉有这么多代码文件。
产出 这是我在没有 @Autowire
的情况下手动创建 BeanTest 对象时得到的输出In BOTimeOutConfig
Received from BeanTest 10 20
In BeanTest class beanWebClient() method execution v1 and v2: 10 20
In BSETimeOutConfig
Received from BeanTest 30 40
In BeanTest class beanWebClient() method execution v1 and v2: 30 40
2021-11-13 14:37:58.161 WARN 404383 --- [ main] JpaBaseConfiguration$JpaWebConfiguration : spring.jpa.open-in-view is enabled by default. Therefore, database queries may be performed during view rendering. Explicitly configure spring.jpa.open-in-view to disable this warning
2021-11-13 14:37:58.613 INFO 404383 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8080 (http) with context path ''
2021-11-13 14:37:58.622 INFO 404383 --- [ main] c.paytmmoney.errordb.ErrordbApplication : Started ErrordbApplication in 4.04 seconds (JVM running for 4.379)
2021-11-13 14:38:07.768 INFO 404383 --- [nio-8080-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring DispatcherServlet 'dispatcherServlet'
2021-11-13 14:38:07.768 INFO 404383 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Initializing Servlet 'dispatcherServlet'
2021-11-13 14:38:07.769 INFO 404383 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Completed initialization in 1 ms
In /test method
In BeanWebClient class, printing from autowired dependency 10 20
In /test method
In BeanWebClient class, printing from autowired dependency 30 40
当我自动装配 BeanTest Class 这是输出:
In BOTimeOutConfig
Received from BeanTest 10 20
In BeanTest class beanWebClient() method execution v1 and v2: 10 20
In BSETimeOutConfig
Received from BeanTest 30 40
In BeanTest class beanWebClient() method execution v1 and v2: 30 40
2021-11-13 14:40:36.072 WARN 404724 --- [ main] JpaBaseConfiguration$JpaWebConfiguration : spring.jpa.open-in-view is enabled by default. Therefore, database queries may be performed during view rendering. Explicitly configure spring.jpa.open-in-view to disable this warning
2021-11-13 14:40:36.585 INFO 404724 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8080 (http) with context path ''
2021-11-13 14:40:36.596 INFO 404724 --- [ main] c.paytmmoney.errordb.ErrordbApplication : Started ErrordbApplication in 4.353 seconds (JVM running for 4.75)
2021-11-13 14:40:45.081 INFO 404724 --- [nio-8080-exec-2] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring DispatcherServlet 'dispatcherServlet'
2021-11-13 14:40:45.081 INFO 404724 --- [nio-8080-exec-2] o.s.web.servlet.DispatcherServlet : Initializing Servlet 'dispatcherServlet'
2021-11-13 14:40:45.082 INFO 404724 --- [nio-8080-exec-2] o.s.web.servlet.DispatcherServlet : Completed initialization in 1 ms
In /test method
2021-11-13 14:40:45.204 ERROR 404724 --- [nio-8080-exec-2] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is java.lang.NullPointerException] with root cause
java.lang.NullPointerException: null
at com.paytmmoney.errordb.repository.BeanTest.message(BeanTest.java:42) ~[main/:na]
at com.paytmmoney.errordb.repository.User.message(User.java:22) ~[main/:na]
at com.paytmmoney.errordb.service.BeanService.printBO(BeanService.java:21) ~[main/:na]
我正在使用休息控制器调用服务中的函数 class。
谢谢!!!
鉴于您正在 TimeOutConfig
中自行创建 BeanTest
和 User
实例,请删除 [=] 中的所有 @Component
和 @Autowired
注释13=]、BeanWebClient
和 User
如下:
public class BeanTest {
private int v1;
private int v2;
BeanWebClient b1;
public BeanTest(){}
public BeanTest(int v1, int v2){
this.v1=v1;
this.v2=v2;
beanWebClient();
}
public BeanWebClient beanWebClient() {
//System.out.println("In BeanTest class beanWebClient() method execution v1 and v2: "+v1+v2);
b1 = new BeanWebClient(v1,v2);
System.out.println("In BeanTest class beanWebClient() method execution v1 and v2: "+b1.getV1()+" "+b1.getV2());
return b1;
}
public void message() {
b1.webClientMessage();
//System.out.println("V1= "+v1+" V2= "+v2);
}
}
public class BeanWebClient {
private int v1;
private int v2;
public BeanWebClient(int v1, int v2) {}
this.v1=v1;
this.v2=v2;
System.out.println("Received from BeanTest "+v1+" "+v2);
}
public BeanWebClient(){ }
public int getV1() {
return v1;
}
public int getV2() {
return v2;
}
public void webClientMessage(){
System.out.println("In BeanWebClient class, printing from autowired dependency "+v1+" "+v2);
}
}
public class User {
private BeanTest beanTest;
public User(BeanTest beanTest) {
this.beanTest=beanTest;
}
public User() {
//System.out.println("user create... hashCode :" + this.hashCode());
}
public void message() {
beanTest.message();
}
}