Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is java.lang.NullPointerException] with root cause 에러해결
2022. 12. 26. 12:02ㆍ프로젝트/[Sleeper] 수면관리 어플리케이션
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
'프로젝트 > [Sleeper] 수면관리 어플리케이션' 카테고리의 다른 글
JdbcSQLIntegrityConstraintViolationException - @GeneratedValue의 GenerationType (0) | 2023.01.06 |
---|---|
URL 작성의 어려움 - HATEOAS (0) | 2023.01.01 |
날짜 시간 데이터 요청/응답 - ZonedDateTime (0) | 2022.12.29 |
날짜 데이터 요청, 응답 처리하기 - LocalDateTime Parsing (0) | 2022.12.26 |
update는 setter()로 수정하는 건데, Entity에 @setter는 쓰지 말라고? (0) | 2022.12.24 |