Репозиторий NullPointerException в классе контроллера Spring

Я получаю исключение NullPointerException в приведенном ниже коде на самом контроллере. Перед тем, как пойти в сервисный класс. Я не мог найти, где я ошибаюсь. Как я новичок в весне.

java.lang.NullPointerException: Cannot invoke "com.sarathUniversity.service.StudentService.createStudentResponse(com.sarathUniversity.request.CreateStudentRequest)" because "this.stdService" is null

2023-05-30T13:13:08.197+05:30  INFO 11192 --- [nio-8080-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring DispatcherServlet 'dispatcherServlet'
2023-05-30T13:13:08.197+05:30  INFO 11192 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet        : Initializing Servlet 'dispatcherServlet'
2023-05-30T13:13:08.198+05:30  INFO 11192 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet        : Completed initialization in 1 ms
2023-05-30T13:22:44.633+05:30  WARN 11192 --- [l-1 housekeeper] com.zaxxer.hikari.pool.HikariPool        : HikariPool-1 - Thread starvation or clock leap detected (housekeeper delta=9m44s455ms305µs600ns).
2023-05-30T13:22:55.734+05:30 ERROR 11192 --- [nio-8080-exec-1] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed: java.lang.NullPointerException: Cannot invoke "com.sarathUniversity.service.StudentService.createStudentResponse(com.sarathUniversity.request.CreateStudentRequest)" because "this.stdService" is null] with root cause

java.lang.NullPointerException: Cannot invoke "com.sarathUniversity.service.StudentService.createStudentResponse(com.sarathUniversity.request.CreateStudentRequest)" because "this.stdService" is null
    at com.sarathUniversity.controller.StudentController.createStudent(StudentController.java:17) ~[classes/:na]
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[na:na]
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]
    at java.base/java.lang.reflect.Method.invoke(Method.java:568) ~[na:na]
    at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:207) ~[spring-web-6.0.9.jar:6.0.9]
    at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:152) ~[spring-web-6.0.9.jar:6.0.9]
    at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:118) ~[spring-webmvc-6.0.9.jar:6.0.9]
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:884) ~[spring-webmvc-6.0.9.jar:6.0.9]
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:797) ~[spring-webmvc-6.0.9.jar:6.0.9]
    at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) ~[spring-webmvc-6.0.9.jar:6.0.9]
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1081) ~[spring-webmvc-6.0.9.jar:6.0.9]
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:974) ~[spring-webmvc-6.0.9.jar:6.0.9]
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1011) ~[spring-webmvc-6.0.9.jar:6.0.9]
    at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:914) ~[spring-webmvc-6.0.9.jar:6.0.9]

На картинке ниже вы можете увидеть значения отладки. В этом

StudentRepository = null
AdressRepository = null

Передача содержимого тела в метод публикации, а также я могу видеть их в консоли отладки.

http://localhost:8080/api/student/create

{
  "firstName":"sarathdaa",
  "lastName": "Kumarda",
  "email": "[email protected]",
  "street": "Pall,Tvk,256",
  "city": "chennai"
}

ОБНОВЛЯТЬ Пробовал @Autowired через StudentService @Service над классом StudentService

Поделился ссылкой на источник ниже.

https://github.com/sarath14kumar/SpringBootMicroService/blob/master/src/main/java/com/sarathUniversity/controller/StudentController.java#L17

Пожалуйста, помогите мне исправить это. Заранее спасибо. Если требуется более подробная информация, пожалуйста, прокомментируйте ниже.

Ваш StudentService не подключен автоматически, поэтому значение по умолчанию становится null, и это вызывает проблему.

Arun Sudhakaran 30.05.2023 11:51

Но IDE показывает, что «внедрение поля не рекомендуется» при размещении @Autowired над StudentService stdService

S14321K 30.05.2023 11:56

В сообщении логера четко сказано, что because "this.stdService" is null. Вы можете отлаживать и видеть в этой строке, является ли stdService нулевым или нет.

Arun Sudhakaran 30.05.2023 12:00

Также обратитесь к ответу @Nandish Chauhan

Arun Sudhakaran 30.05.2023 12:01

Да с этим пробовал. все еще не работал. А также обновил это в моем вопросе

S14321K 30.05.2023 12:13
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
5
59
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вы не используете Внедрение зависимостей (DI). Есть несколько способов сделать эту инъекцию в архитектуре Spring.

@RestController
@RequestMapping("/api/student")
public class StudentController extends CreateStudentRequest
{
    private final StudentService stdService;

    // a constructor so that the Spring container can inject a StudentService.
    public StudentController(StudentService stdService) {
        this.stdService = stdService;
    }

    // ...
}

Кроме того,

  • Вам не нужно extends CreateStudentRequest в классе StudentController.
  • Вам нужно добавить аннотацию @Service к вашему классу StudentService.

Я разветвил ваш код и вот результат:

Извините, это не сработало. Сервер остановлен с ошибкой.

S14321K 30.05.2023 12:01
The dependencies of some of the beans in the application context form a cycle: ┌──->──┐ | studentController defined in file [E:\IntellijProjects\UniversityMonolithicApp\target\classes\‌​com\sarathUniversity‌​\controller\StudentC‌​ontroller.class] └──<-──┘ Action: Relying upon circular references is discouraged and they are prohibited by default. Update your application to remove the dependency cycle between beans. As a last resort, it may be possible to break the cycle automatically by setting spring.main.allow-circular-references to true.
S14321K 30.05.2023 12:02

@ Sarath14Kumar Sarath14Kumar это сработало, но теперь вы получаете еще одну ошибку, и сообщение об ошибке объясняет, что не так. У вас есть циклическая зависимость, которую вам нужно исправить. Есть ли у StudentService контроллер в качестве зависимости? Этого не должно быть.

Jesper 30.05.2023 12:17

Да, это сработало для меня. Теперь столкнулся с той же проблемой в классе StudentService. java.lang.NullPointerException: Cannot invoke "com.sarathUniversity.repository.AdressRepository.save(Objec‌​t)" because "this.adressRepository" Стоит ли мне сделать то же самое здесь?

S14321K 30.05.2023 12:31
addrs = adressRepository.save(addrs); в этой строке
S14321K 30.05.2023 12:31

Почему я должен делать это, когда доступен @AutoWired. Могу я знать

S14321K 30.05.2023 12:35

См. stackoverflow.com/q/40620000/2039546

İsmail Y. 30.05.2023 13:16

Тут может быть две проблемы

  1. вам нужно аннотировать StudentService с помощью аннотации @Service
  2. вам нужно аннотировать объект stdService с помощью аннотации @Autowired. Сначала попробуйте это, и только тогда мы сможем отлаживать дальше

Попробовал с вашим мнением, но не получилось. Обновил вопрос теперь с вашим.

S14321K 30.05.2023 12:12

вы расширяете CreateStudentRequest из StudentService, а также расширяете StudentController из CreateStudentRequest, а затем автоматически связываете StudentService. это не работает так, как эта весенняя загрузка. Я не знаю, почему вы расширяете CreateStudentRequest из StudentService, также вам нужно аннотировать свой репозиторий с помощью @Repository и автоматически подключить их в сервисе.

Nandish Chauhan 30.05.2023 12:27

Другие вопросы по теме