ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is java.lang.NullPointerException] with root cause 에러해결
    Project Trouble Shooting/[Sleeper] 수면관리 어플리케이션 2022. 12. 26. 12:02
    728x90

    문제 발생

     

    아래와 같은 에러가 발생했습니다...

    2022-12-26 11:43:40.857 ERROR 11104 --- [nio-8080-exec-1] 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 econo.app.sleeper.web.diary.DiaryController.saveDiary(DiaryController.java:56) ~[main/:na]
    	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]
    	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[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:566) ~[na:na]
    	at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:205) ~[spring-web-5.3.23.jar:5.3.23]
    	at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:150) ~[spring-web-5.3.23.jar:5.3.23]
    	at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:117) ~[spring-webmvc-5.3.23.jar:5.3.23]
    	at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:895) ~[spring-webmvc-5.3.23.jar:5.3.23]
    	at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808) ~[spring-webmvc-5.3.23.jar:5.3.23]
    	at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) ~[spring-webmvc-5.3.23.jar:5.3.23]
    	at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1071) ~[spring-webmvc-5.3.23.jar:5.3.23]
    	at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:964) ~[spring-webmvc-5.3.23.jar:5.3.23]
    	at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) ~[spring-webmvc-5.3.23.jar:5.3.23]
    	at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:909) ~[spring-webmvc-5.3.23.jar:5.3.23]
    	at javax.servlet.http.HttpServlet.service(HttpServlet.java:696) ~[tomcat-embed-core-9.0.68.jar:4.0.FR]
    	at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) ~[spring-webmvc-5.3.23.jar:5.3.23]
    	at javax.servlet.http.HttpServlet.service(HttpServlet.java:779) ~[tomcat-embed-core-9.0.68.jar:4.0.FR]
    	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:227) ~[tomcat-embed-core-9.0.68.jar:9.0.68]
    	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) ~[tomcat-embed-core-9.0.68.jar:9.0.68]
    	at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) ~[tomcat-embed-websocket-9.0.68.jar:9.0.68]
    	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) ~[tomcat-embed-core-9.0.68.jar:9.0.68]
    	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) ~[tomcat-embed-core-9.0.68.jar:9.0.68]
    	at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) ~[spring-web-5.3.23.jar:5.3.23]
    	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) ~[spring-web-5.3.23.jar:5.3.23]
    	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) ~[tomcat-embed-core-9.0.68.jar:9.0.68]
    	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) ~[tomcat-embed-core-9.0.68.jar:9.0.68]
    	at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) ~[spring-web-5.3.23.jar:5.3.23]
    	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) ~[spring-web-5.3.23.jar:5.3.23]
    	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) ~[tomcat-embed-core-9.0.68.jar:9.0.68]
    	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) ~[tomcat-embed-core-9.0.68.jar:9.0.68]
    	at org.springframework.session.web.http.SessionRepositoryFilter.doFilterInternal(SessionRepositoryFilter.java:142) ~[spring-session-core-2.7.0.jar:2.7.0]
    	at org.springframework.session.web.http.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:82) ~[spring-session-core-2.7.0.jar:2.7.0]
    	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) ~[tomcat-embed-core-9.0.68.jar:9.0.68]
    	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) ~[tomcat-embed-core-9.0.68.jar:9.0.68]
    	at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) ~[spring-web-5.3.23.jar:5.3.23]
    	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) ~[spring-web-5.3.23.jar:5.3.23]
    	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) ~[tomcat-embed-core-9.0.68.jar:9.0.68]
    	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) ~[tomcat-embed-core-9.0.68.jar:9.0.68]
    	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:197) ~[tomcat-embed-core-9.0.68.jar:9.0.68]
    	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97) ~[tomcat-embed-core-9.0.68.jar:9.0.68]
    	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:541) ~[tomcat-embed-core-9.0.68.jar:9.0.68]
    	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:135) ~[tomcat-embed-core-9.0.68.jar:9.0.68]
    	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) ~[tomcat-embed-core-9.0.68.jar:9.0.68]
    	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78) ~[tomcat-embed-core-9.0.68.jar:9.0.68]
    	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:360) ~[tomcat-embed-core-9.0.68.jar:9.0.68]
    	at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:399) ~[tomcat-embed-core-9.0.68.jar:9.0.68]
    	at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) ~[tomcat-embed-core-9.0.68.jar:9.0.68]
    	at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:893) ~[tomcat-embed-core-9.0.68.jar:9.0.68]
    	at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1789) ~[tomcat-embed-core-9.0.68.jar:9.0.68]
    	at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) ~[tomcat-embed-core-9.0.68.jar:9.0.68]
    	at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191) ~[tomcat-embed-core-9.0.68.jar:9.0.68]
    	at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659) ~[tomcat-embed-core-9.0.68.jar:9.0.68]
    	at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) ~[tomcat-embed-core-9.0.68.jar:9.0.68]
    	at java.base/java.lang.Thread.run(Thread.java:834) ~[na:na]

     

     

    현재 상황

     

    @Slf4j
    @RestController
    @RequiredArgsConstructor
    @RequestMapping("/diary-management")
    public class DiaryController {
    
        DiaryService diaryService;
    
        @PostMapping("/diaries")
        public ResponseEntity<DiaryResponse> saveDiary(DiaryRequestForm diaryRequestForm, @SessionAttribute(SessionConst.LOGIN_USER) Object loginUser) {
            LoginUser loginUser1 = (LoginUser) loginUser;
            System.out.println("loginUser1 = " + loginUser1.getUserId());
            System.out.println("diaryRequestForm = " + diaryRequestForm.getContent());
            System.out.println("diaryRequestForm = " + diaryRequestForm.getLocalDateTime());
    
            System.out.println("---------------------------------------------");
    
            DiaryDto diaryDto = DiaryDto.of(loginUser1.getUserId(), diaryRequestForm.getContent(), diaryRequestForm.getLocalDateTime());
    
            System.out.println("diaryDto = " + diaryDto.getUserId());
            System.out.println("diaryDto.getContent() = " + diaryDto.getContent());
            System.out.println("diaryDto.getLocalDateTime() = " + diaryDto.getLocalDateTime());
    
            System.out.println("---------------------------------------------");
    
            DiaryResponse diaryResponse = diaryService.saveDiary(diaryDto);
            System.out.println("diaryResponse = " + diaryResponse.getDiaryPk());
            System.out.println("diaryResponse.getIncreasedMoney() = " + diaryResponse.getIncreasedMoney());
    
            System.out.println("---------------------------------------------");
            return new ResponseEntity<>(diaryResponse,HttpStatus.CREATED);
        }

     

    @Service
    @Transactional(readOnly = true)
    public class DiaryService {
    
        private final DiaryRepository diaryRepository;
        private final UserRepository userRepository;
    
        @Autowired
        public DiaryService(DiaryRepository diaryRepository, UserRepository userRepository) {
            this.diaryRepository = diaryRepository;
            this.userRepository = userRepository;
        }
    
        @Transactional
        public DiaryResponse saveDiary(DiaryDto diaryDto){
            System.out.println("---------------------------------------------");
            System.out.println("diaryDto = " + diaryDto.getContent());
            System.out.println("diaryDto.getUserId() = " + diaryDto.getUserId());
            System.out.println("diaryDto = " + diaryDto.getLocalDateTime());
            System.out.println("---------------------------------------------");
            LocalDate localDate = DateJudgementUtil.checkSavingDate(diaryDto.getLocalDateTime());
            System.out.println("---------------------------------------------");
            User user = userRepository.findById(diaryDto.getUserId()).get();// 로그인 할 때 필터링이 되있기 때문에 null 체크 안 함
            System.out.println("user.getUserPk() = " + user.getUserPk());
            System.out.println("user.getUserMoney() = " + user.getUserMoney());
            System.out.println("---------------------------------------------");
            Diary diary = diaryDto.toEntity(localDate, user);
            diaryRepository.save(diary);
    
            System.out.println("---------------------------------------------");
            // 돈 증가
            Integer judgeMoney = MoneyManager.judgeMoney(diaryDto.getContent());
            Integer increasedMoney = MoneyManager.earnMoney(user.getUserMoney(), judgeMoney);
            user.updateMoney(increasedMoney);
    
            System.out.println("---------------------------------------------");
            return DiaryResponse.of(diary.getDiaryPk(),judgeMoney);
        }

     

     

    NullPointerException이라니... Controller에서 Servcie로 넘어갈 때 dto의 값 중에 null값이 있나, 아니면 dto 자체가 null값이 되버렸나...

     

    그런데..

     

     

    dto도 존재하고 값도 다 있고, 근데 왜 안 되는 걸까요??

     

    눈치 빠른 분은 아셨겠지만, 제 프로젝트 소스코드중 Controller에 잘못된 부분이 있죠...

     

    네.. 바로 private final을 필드에 선언을 해주지 않아 Spring에서 diaryService에 Bean이 주입이 되지 않았습니다ㅠㅠ

     

     

    문제 해결

     

    private final DiaryService diaryService;

     

    여러분 항상 정신 차리고 코딩하셔야 합니다...

     

     

    이상입니다 !!

     

    파이팅~~!!!

    728x90
Designed by Tistory.