spring crudRepository null pointer exception

74
12 ноября 2021, 01:30

Есть класс @Entity ResultCode, далее есть интерфейс который extends CrudRepository, в классе контроллера я могу пользоваться resultCodeRepository интерфейсом, но в других классах появляется NullPointerException. Как решить проблему?

Класс POJO

    @Entity(name="result_codes")
public class ResultCode implements Serializable {
    @Id
    @SequenceGenerator(name = "sequence_rescode", sequenceName = "rescode_seq", allocationSize = 1)
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "sequence_rescode")
    private Integer result_id;
    @Column(name="result_code",unique = true)
    private String resultCode;
    @Column(name="result_descr")
    private String resultDescr;

Класс Repository

@Repository
public interface ResultCodeRepository extends CrudRepository<ResultCode, Integer> {
    Optional<ResultCode> getResultCodeByResultCode(String string);
}

Класс Controller где работает..

@Controller
@RequestMapping(path="/index")
public class IndexController {
    @Autowired
    private ResultCodeRepository resultCodeRepository;
   @GetMapping(path="/all")
    public @ResponseBody Iterable<ResultCode> getAllUsers() {
        return resultCodeRepository.findAll();
    }
}

Класс где не работает

@Component
public class Test  {
    private ResultCodeRepository resultCodeRepository;
    @Autowired
    public void setResultCodeRepository(ResultCodeRepository resultCodeRepository){
        this.resultCodeRepository = resultCodeRepository;
    }
    public void persistAll(){
        resultCodeRepository.save(new ResultCode("90","Все хорошо"));
        System.out.println("rescode has been saved");
    }
}

Класс main

@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        ApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig.class);
        SpringApplication.run(Application.class, args);
       Test test = new Test();
        test.persistAll();
    }
}
Answer 1

Так делать нельзя. Если вы создаете экземпляр класса через new, то контейнер спринга ничего о нем не знает, соответственно, не может инжектить в него бины. Вы выходите за пределы контексте спринга, поэтому и все, что вы пытаетесь проинжектить не инициализируется, соответсвенно, вы получаете данное исключение. Если Вам нужно прямо из главного класса проинжектить бин и вызвать у него метод, то можно сделать так:

import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
    @Bean
    public CommandLineRunner init(Test test) {
        return (args) -> {
            test.persistAll()
        };
    }
}
READ ALSO
Точные типы в Java

Точные типы в Java

Есть ли в Java точные типы? Потому что как мы знаем в float/double происходит потеря точности и деньги в таких типах хранить не стоит

100
Не компилируется код vaadin

Не компилируется код vaadin

Суть задачи- получить с сервера json и вывести его в listbox вот DTO

218
Использование Whatsapp в своём приложении

Использование Whatsapp в своём приложении

Есть ли какой-нибудь способ встроить в своё приложение вход, отправку и получение сообщений от Whatsapp?

158