java .lang.NullPointerException при весенней загрузке - PullRequest
1 голос
/ 18 февраля 2020

Я создал простой java класс в приложении весенней загрузки. вызов метода ns.mesage (); из двух разных методов, но один выполняется, а другой вызывает исключение нулевого указателя.

package TestPackage;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Async;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

/*
import TestPackage.MorningService;
import TestPackage.NightService;*/

@RestController
public class GenerateMessage {


    @Autowired
    public MorningService ms;

    @Autowired
    public NightService ns;



    @RequestMapping(path = "/test")
    public String starter(){
        GenerateMessage gm=new GenerateMessage();
        ns.mesage(); // this call working fine

        gm.mes();
        return "Mail scheduled.";
    }




public void mes(){
    try{
    System.out.println("starts2..............");
    ns.mesage(); // throwing an exception
    }catch(Exception e){
        e.printStackTrace();
    }
}
}

Ответы [ 3 ]

3 голосов
/ 18 февраля 2020

Как только вы используете ключевое слово new, вы ломаете все инъекции, используемые с @Autowired (это означает, что MorningService и NightService не будут инициализированы), поэтому вы получение NPE.

Если вы действительно хотите проверить свой метод mes() на своем контроллере, внедрите в своем классе @SpringBootApplication интерфейс CommandLineRunner.

Затем вы можете ввести GenerateMessage bean с @Autowired и протестируйте свой метод.

Вот пример:

@SpringBootApplication
public class MainApplication implements CommandLineRunner {

 @Autowired
 private GenerateMessage generateMessage;

 public static void main(String[] args) {
    SpringApplication.run(MainApplication.class, args);
 }

 @Override
 public void run(String... args) throws Exception {
    generateMessage.mes();
 }
}
1 голос
/ 18 февраля 2020

Вы не должны смешивать использование нового с Autowired.

Как только вы используете новое ключевое слово, вы ломаете все инъекции, используемые с @Autowired (это означает, что MorningService и NightService не будут инициализировано), поэтому вы получаете NPE.

Soulution №1

используйте AUTOWIRE

@Autowired
public MorningService ms;

@Autowired
public NightService ns;

@Autowired
GenerateMessage gm;

@RequestMapping(path = "/test")
public String starter(){
//        GenerateMessage gm=new GenerateMessage();
    ns.mesage(); // this call working fine

    gm.mes();
    return "Mail scheduled.";
}

Решение № 2

использование это ключевое слово

@RequestMapping(path = "/test")
public String starter(){
//        GenerateMessage gm=new GenerateMessage();
    ns.mesage(); // this call working fine

    this.mes();
    return "Mail scheduled.";
}
0 голосов
/ 18 февраля 2020

Когда вы создаете экземпляр с ключевым словом new , он не go в течение жизненного цикла Spring Bean. В результате постпроцессор, ответ на обработку аннотации @Autowired не работает, а NightService не внедряется в новый экземпляр GenerateMessage. Вы просто создаете экземпляр класса с пустыми полями.

Если вы хотите создать настоящий боб вручную, вы должны сделать это так:

@RestController
public class GenerateMessage {


    @Autowired
    public MorningService ms;

    @Autowired
    public NightService ns;

    @Autowired
    private ApplicationContext applicationContext;

    @RequestMapping(path = "/test")
    public String starter(){
        GenerateMessage gm=applicationContext.getBean(GenerateMessage.class);
        ns.mesage(); // this call working fine

        gm.mes();
        return "Mail scheduled.";
    }




public void mes(){
    try{
    System.out.println("starts2..............");
    ns.mesage(); // throwing an exception
    }catch(Exception e){
        e.printStackTrace();
    }
}
}

Но я не рекомендую вам работать непосредственно с приложением, потому что это тяжелый объект и может привести к снижению производительности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...