Springboot @Component и @Autowired аннотированы, но все еще получают исключение нулевого указателя - PullRequest
0 голосов
/ 10 декабря 2018

Я все еще не мог понять, почему я получаю NPE на

foo.setName("FOOD")

Вот код, который я пытаюсь запустить, и сталкиваюсь с проблемой.

@SpringBootApplication
public class Application {

@Autowired
private static Foo foo;


public static void main(String[] args) throws Throwable {
    SpringApplication.run(Application.class, args);
    foo.setName("FOOD");
}

}


@Component
class Foo {
private String name;

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}
}

Оба Foo and Application классы находятся в одной упаковке.Единственный способ заставить его работать, это применить конфигурацию Java.Поэтому вместо

@Autowired
private static Foo foo;

я создал экземпляр, используя

@Bean
private static Foo getFoo(){
  return new Foo();
}

Я попытался добавить @Componentscan в класс конфигурации, но не сработал.Любая идея?Спасибо!

1 Ответ

0 голосов
/ 10 декабря 2018

Хорошо спросить, а также поделиться своим ответом.Если кто-нибудь сталкивался с той же путаницей, это могло бы помочь.То, что я пропустил, было то, что bean должен быть введен в конструктор класса Application.

Изменение кода следующим образом не привело к исключению нулевого указателя.

@SpringBootApplication
public class Application {
    private static Foo foo;

    @Autowired
    public Application(Foo foo) {
        this.foo = foo;
    }

@Bean
public RestTemplate getRestTemplate() {
    return new RestTemplate();
}

public static void main(String[] args) throws Throwable {
    SpringApplication.run(Application.class, args);
    foo.setName("FOOD");
    System.out.println(foo.getName()); //FOOD ... console out put
}
}


@Component
class Foo {
    private String name;

    public String getName() {
        return name;
    }

public void setName(String name) {
    this.name = name;
}
}
...