묻고 답해요
164만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결스프링 핵심 원리 - 기본편
스프링 컨테이너?
스프링 컨테이너가 이전시간에 설명해 주신 DI컨테이너랑 같은 용어인가요? 즉 IoC 컨테이너 = DI 컨테이너 = 스프링 컨테이너 인가요?
-
해결됨스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
람다식 질문
=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요?예 3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]여기에 질문 내용을 남겨주세요. 안녕하세요. 강의 항상 잘 듣고 있습니다. 또한 항상 수고스럽게 답변해주시는 서포터 분들에게 먼저 감사 말씀 드립니다. 람다식의 용법에 대해서 궁금한 점이 있습니다. private Map<String, String> createParamMap(HttpServletRequest request) { Map<String, String> paramMap = new HashMap<>(); request.getParameterNames().asIterator() .forEachRemaining(paramName -> paramMap.put(paramName, request.getParameter(paramName))); return paramMap;} 위의 코드에서 paramName -> paramMap.put(paramName, request.getParameter(paramName))); 의 라인에서 paramName 이라는 매개변수를 어떻게 사용할 수 있는건가요? 람다식이 (파라미터) -> (로직) 의 형태((a,b) -> (a+b)로 사용하는 문법인 걸로 알고 있는데 위의 코드가 paramName이라는 매개변수를 받아서 paramMap에 paramName이라는 Key와 request.getParameter(paramName)이라는 Value를 넣는 것으로 이해했습니다. 그런데 paramName을 선언한 곳은 없는데 어떻게 사용할 수 있을까요? 자바 문법적인 강의는 영한 선생님께서 기본이라 안 해주시지만, 이미 기본서를 읽고 왔고 나름대로 검색을 해봤는데도 해답을 얻을 수가 없어서 질문을 남기게 되었습니다.
-
해결됨스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
안녕하세요 localhost:8080/hello 부분 질문드립니다.
안녕하세요 localhost:8080/hello를 요청하는 부분에서 매핑페이지가 없다고 오류가 나옵니다. // hello 서블릿 클래스 입니다. //서버는 8080포트라고 잘 뜹니다. //스프링부트 메인 클래스 입니다. 스프링부트 메인페이지가 최상단에 위치해야 한다고 하여 main 클래스를 확인해보아도 hello.servlet 으로 위치해있고 , 위치를 hello로 바꾸어도 결과는 똑같았습니다. webapp에 만들어놓은 정적 페이지를 요청했을땐 잘 실행이 됩니다. 그 이후에 response 등등 여러 클래스를 만들었던 url로 요청을해도 모두 매핑페이지가 없다고 뜹니다. 감사합니다
-
해결됨스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
뷰 관련 파일을 webapp 폴더아래에 넣었을 스프링이 인식하는 과정
예전에 레거시로 스프링 프로젝트를 작성할때는 pom.xml에 폴더 경로를 써줬던 것 같은데 제가 못찾는 것이거나 부트를 사용해서 그런지 그런 설정을 찾아볼 수가 없네요. 혹시 webapp 폴더에 넣어야 한다는 설정을 어디서 찾아볼 수 있을까요??
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
model 객체를 쓰는이유가 뭔가요?
왜 model에 데이터를 보관해야하는건가요??
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
Cannot find template location: classpath:/templates/ (please add some templates or check your Thymeleaf configuration) 오류가 뜹니다
안녕하세요! 8분 경에 LogTestController를 실행했는데 화면은 정상적으로 출력이 됩니다! 근데 콘솔 출력에 2022-01-13 14:36:41.745 WARN 1632 --- [ main] ion$DefaultTemplateResolverConfiguration : Cannot find template location: classpath:/templates/ (please add some templates or check your Thymeleaf configuration) 라는 오류가 뜨는데 이건 왜 뜨는걸까요???
-
해결됨스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
어플리케이션 로직이 필요한 검증의 분리
안녕하세요. 항상 강의 너무 잘 듣고 있습니다! 개인 프로젝트로 질문/답변 게시판 웹사이트 구현을 진행하고 있습니다. 대부분의 로직에 질문/답변 요청의 작성자임을 확인하는 로직이 필요한데 해당 검증 로직은 필연적으로 어플리케이션(DB단 까지)로직이 필요합니다. 제 생각에 검증기validator 클래스를 도입하는 것 보다 Filter나 인터셉터를 활용하는 방식이 좋아보이는데 맞을까요?? 현재 코드는 아래와 같습니다. 게시글의 수정페이지에 대한 Get매핑과 수정하는 PostMapping입니다. Post - 게시글, Account - 계정(작성자) @GetMapping("qna/edit/{postId}")public String PostEditForm(@PathVariable Long postId, Model model){ //사용자 검증 if(!isValidEditRequest(postId)){ return "denied"; } Post post = postService.findById(postId); model.addAttribute("post",post); return "qna/edit";}@PostMapping("qna/edit/{postId}")public String PostEdit(@PathVariable Long postId, PostDto postDto){ //사용자 검증 if(!isValidEditRequest(postId)){ return "denied"; } //수정 postService.edit(postId,postDto); //수정 후 수정된 게시글로 이동 return "redirect:/qna/show/"+postId;}private boolean isValidEditRequest(Long postId) { return postService.isWrittenBy(postId, getAccount().getId());} 질문은 아래와 같습니다. 1. Validator, Filter, Interceptor가 service를 참조해도 괜찮을까요? 2. 해당 로직을 처리하는 정형화된 방식이 Spring Security에 있을까요?? 감사합니다!
-
미해결스프링 핵심 원리 - 기본편
로드맵에 관련해서 질문드립니다
강의를 수강하다가 시험이랑 겹쳐 내용을 많이 까먹은 것 같아서 처음부터 다시 보려고 합니다! 스프링 입문 - 코드로 배우는 스프링 부트 > 웹 MVC, DB 접근 기술 > 스프링 핵심 원리 - 기본편 > 모든 개발자를 위한 HTTP 웹 기본 지식 > 스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술 > 스프링 MVC 2편 - 백엔드 웹 개발 활용 기술 > 스프링 핵심 원리 - 고급편 순서로 수강한 후 김영한의 스프링 부트와 JPA 실무 완전 정복 로드맵의 야생편을 따라가면 될까요?
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
강의 관련하여 질문이 있습니다!
연관된 질문이 있습니다. 1. (2번을 위한 질문입니다) 리엑트 같은 경우 서버에서 쏴준 Json데이터를 통해 클라이언트 웹에서 JS가 받은 데이터를 만져서 결과를 사용자에게 보여주는데 이러한 방식이 Rest API방식이다. 라고 인지하고있는데 맞을까요? 2. 1번이 맞다면 해당 메시지과 국제화에 관련해서, 리엑트에서는 받은 데이터를 가지고 만지기때문에 타임리프를 쓰지않을텐데, 보통 실무에서는 리엑트같은 RESTAPI의 경우 어떤식으로 국제화, 메시지를 관리하는지 궁금합니다!
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
DB url에서 막혀요ㅠㅠ
Database "mem:ea62e49b-fd2d-4217-8245-939ed574682c" not found, either pre-create it or allow remote database creation (not recommended in secure environments) [90149-200] 90149/90149 (도움말) 자꾸 이런 오류가 떠요ㅠㅠ
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
강의자료에 있는 내용 중에 궁금한 것이 있어 질문드립니다.
안녕하세요. 이번 강의에서는 Servlet 종속성을 제거하기 위해 'ModelView' 객체를 만들고, 이를 적극 활용하는 컨트롤러를 만드는 것에 대해 다루었는데요. 강의 자료에 다음과 같은 내용이 있었습니다. (빨간색으로 밑줄 그은 내용) 여기서 말하는 "테스트하기 쉽다" 라는 말은 정확히 어떤 의미인가요? 무언가에 종속적이면 테스트 코드를 작성하기 어렵다는 뜻으로 받아들여도 되는걸까요? 조금 더 구체적으로 설명해주시면 정말 감사하겠습니다!
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
port in use 8080 에러
안녕하세요! 강의를 듣다가 문제가 생겨서 연락드렸습니다.. 아래 사진과 같이 8080 포트를 이미 사용중이라는 에러를 보고 해결해보려고 cmd의 netstat -ano 명령어를 사용했습니다. 사진처럼, 8080포트를 사용중인 프로세스가 없는데 ide를 실행하면 8080이 이미 사용중이라고 뜨네요... stackoverflow에서 프로세스에 javaw가 동작하고 있을수도 있다고 해서 해당 프로세스를 찾아봤지만 없었습니다. 재부팅, ide 껏다 키기 등등으로도 해결이 안되는데 그냥 포트를 임의로 8090으로 변경해서 사용하는게 답일까요....?
-
해결됨스프링 핵심 원리 - 기본편
DiscountPolicy 설계 관련 질문입니다.
안녕하세요. DiscountPolicy 설계 관련하여 질문드립니다. 해당 클래스 내 discount 메서드에서, 할인된 금액(= 할인 정책 적용 후 총 금액)이 아닌 할인 대상 금액(= 깎아준 금액)을 리턴하는 이유가 궁금합니다. 정액 할인 정책을 고려하고 있기 때문에 이를 쉽게 확인하기 위해 할인 대상 금액을 리턴한다고 보면 될까요? 할인 자체만 놓고 본다면 할인 후 총액을 사용하는 경우가 더 많지 않나, 해서 여쭤봅니다.
-
미해결실전! 스프링 데이터 JPA
Dto를 다 다르게 만들어야 할까요..?
안녕하세요. 강의 너무 잘 보고 있습니다. JPA와 관련된 질문은 아닌거 같은데 강의를 보다가 항상 궁금했던 점이 언급되어서 이렇게 질문드립니다. 엔티티를 그대로 클라이언트로 넘기면 엔티티가 변경되었을때 API 스팩이 변경되기 때문에 DTO로 변환해서 넘겨줘야 한다고 하셨는데 예를들어 만약에 10개의 API가 Member 정보를 필요로 할 경우(Member 엔티티의 필드가 약 20개 정도 된다고 가정) 각 API 마다 MemberDto 클래스를 모두 생성하고 각 MemberDto에 Member엔티티를 dto로 매핑하는 로직을 모두 작성해야 하나요..? 10개 모두 생성해서 사용하려 하니 클래스 네이밍도 어렵고 코드 중복이 너무 많아지는것 같고,10개 API 에서 필요로하는 Member 정보를 모두 담은 하나의 MemberDto를 만들어 사용하려 하니 엔티티를 사용할 때의 문제와 같이 MemberDto를 변경하면 10개 API 스팩이 변경되는 문제가 발생합니다.. 제가 생각했을때 제일 최선의 방법은 API마다 리스폰VO 클래스를 만들고 해당 클래스에 static inner 클래스로 MemberDto를 선언하는것인데.. 혹시 실무에서 사용하는 best practice가 어떤거일까요..?
-
미해결실전! 스프링 데이터 JPA
mapper 문의
이번 강의로 자신감을 얻고 spring-data-jpa로 시스템 구축 해보려고 합니다. 하나하나 신중히 접근중입니다. ㅎㅎ DTO <--> Entity 변환시에 modelmapper, mapstruct 중에 어느걸 많이 사용하시나요? 혹시 강사님은 현업에서 어떤걸 사용하시는지 궁금합니다.
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
QueryDsl compile이 EC2 인스턴스에서 되지 않습니다..
안녕하세요 QueryDsl 실습 중 에러를 해결하지 못해서 질문 드립니다. QueryDsl 을 사용하던 SpringBoot 프로젝트를 배포하고자 AWS EC2 인스턴스에서 해당 프로젝트 git clone하고 실행을 하려고 하는데 다음과 같은 오류가 납니다. 인텔리제이에서 프로젝트를 실행할 때에는 generated\querydsl 위치에 Qclass 파일들이 잘 컴파일 되었었는데 외부 인스턴스에서 실행시 해당 폴더를 찾을 수 없다고 뜨는데 이유를 모르겠네요 ㅠㅠ 아래는 제가 build.grade에서 작성한 queryDsl 관련 설정입니다. plugins { id 'org.springframework.boot' version '2.5.6' id 'io.spring.dependency-management' version '1.0.11.RELEASE' id "com.ewerk.gradle.plugins.querydsl" version "1.0.10" id 'java' } group = 'com.example' version = '0.0.1-SNAPSHOT' sourceCompatibility = '1.8' configurations { compileOnly { extendsFrom annotationProcessor } } repositories { mavenCentral() } dependencies { implementation 'org.springframework.boot:spring-boot-starter-data-jpa' implementation 'org.springframework.boot:spring-boot-starter-thymeleaf' implementation 'com.querydsl:querydsl-jpa' implementation 'org.springframework.boot:spring-boot-starter-validation' implementation 'org.springframework.boot:spring-boot-starter-web' compile "com.mysema.querydsl:querydsl-jpa:3.6.3" compile "com.mysema.querydsl:querydsl-apt:3.6.3:jpa" implementation 'junit:junit:4.13.1' implementation 'org.projectlombok:lombok:1.18.18' compileOnly 'org.projectlombok:lombok' runtimeOnly 'com.h2database:h2:1.4.199' annotationProcessor 'org.projectlombok:lombok' testImplementation 'org.springframework.boot:spring-boot-starter-test' implementation('org.slf4j:jcl-over-slf4j') implementation('ch.qos.logback:logback-classic') } test { useJUnitPlatform() } //def querydslDir = 'src/main/generated' def querydslDir = "$buildDir/generated/querydsl" // (3) querydsl { // (4) library = "com.querydsl:querydsl-apt" jpa = true querydslSourcesDir = querydslDir } sourceSets { // (5) main.java.srcDirs querydslDir } configurations { // (6) querydsl.extendsFrom compileClasspath } compileQuerydsl { // (7) options.annotationProcessorPath = configurations.querydsl } compileQuerydsl.doFirst { if(file(querydslDir).exists() ) delete(file(querydslDir)) }
-
미해결스프링 핵심 원리 - 기본편
수정자 주입이 아닌 생성자 주입을 해야하는 이유에 대하여
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용] 안녕하세요 제목 그대로 수정자 주입이 아닌, 생성자 주입을 해야하는 이유에 대한 설명 중 이해가지 않는 부분이 있어서 질문드립니다 ppt에 "수정자 주입을 사용하면, setXxx 메서드를 public으로 열어두어야 한다. " 라는 근거가 있는데요. setter는 반드시 public으로 열어야하는 것 아닌가요? , public이 아닌 접근제어자로 setter를 작성하는 경우도 있나요? 그래서 전 이 부분을 수정자 주입을 위해선 setter가 필요없는, 혹은 변경될 위험이 있어서 getter만 작성하고 setter를 작성하지 않는 클래스에도 setter를 포함해야한다. 라고 이해하였는데 이게 의도하신 의미일까요?
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
클라이언트 dataType 설정 -> Produces 쓰면 되나요?
클라이언트에서 ajax 로 dataType 을 JSON 으로 설정하면 서버에서 Produces JSON 설정하는거 맞나요?
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
DI 방식
안녕하세요, 자바 코드로 스프링 빈 등록하기 강좌에서 질문이 있는데요! 세 가지 질문이 있습니다. 1. @Bean public MemberService memberService() { return new MemberService(MemberRepository()); } 이 뜻은 MemberService와 MemberRepository형의 객체가 의존 관계를 맺고 있다는 뜻이고, 따라서 당연히 MemberService에 가면 MemberRepository형의 멤버변수가 선언되어 있는 걸 볼 수 있는데, 스프링 설정 클래스에서 위와같이 의존관계를 넣어줬으니 MemberService에서는 더이상 @Autowired 어노테이션이 생성자에 필요가 없는 거라고 이해하면 될까요? 조금 더 종합적으로 살펴봤을 때, 컴포넌트 스캔 방식일때는 해당 클래스에서 @Autowired 로 주입받는 객체와의 의존관계를 명시하고 주입해줘야 하는 방법 밖에 없고, 이와 같이 직접 자바 코드로 설정파일 이용해 빈을 등록하는 방식에서는 방법 1 : 수업과 같이 설정클래스에서 위에 작성된 코드로 의존주입한다, 단 저런 방식으로 주입할 경우 MemberService에는 생성자에 @Autowired가 필요없어짐 방법 2 : @Bean public MemberService memberService() { return new MemberService(); } 로 작성하고 MemberService 클래스에서 필드나 생성자에 @Autowired로 MemberRespository 빈 객체 주입 명시 이렇게 두 가지 방법이 있는 것으로 이해하면 될까요? 2. 잠깐 지나가는 말씀으로 세터 메서드에 @Autowired가 붙는 방법을 알려 주셨는데, 세터 메서드는 개발자가 직접 호출하지 않아도 스프링이 알아서 호출해주나요? @Autowired가 붙은 생성자를 저희가 직접 호출해준적은 없는 거 같은데, 세터도 동일한지 궁금합니다. 즉 @Autowired를 멤버변수 필드나 세터나 생성자에 붙이면 개발자가 호출할 필요 없이 알아서 스프링이 자동호출도 해주고 의존객체도 연결해주는 것으로 이해해도 되는지요? 3. 의존 주입을 하는 객체(A)와, 주입을 받는 객체(B)는 모두 빈으로 등록되어야 하는지 궁금합니다. 주입되는 인자(A)는 꼭 빈으로 등록된 객체여야 오류가 안 난다는 것은 수업에서도 알려주셔서 명확히 기억이 나는데, 주입을 받는 객체(B)도 항상 빈으로 등록된 객체여야 하나요? 질문이 많고 긴데 읽어주셔서 감사합니다!
-
해결됨스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
2:51 시점 코드실행시 에러발생
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]안녕하세요 영한님! 강의 항상 잘 보며 큰 도움 얻고있습니다. 감사합니다 :) 실습진행 중 에러가 발생하였는데, 이유를 찾지못하여 문의글 남기게되었습니다. 02:51 시점 코드 실행시에 아래와 같은 에러메세지가 뜨며 505 status상태입니다. objectMapper.writeValueAsString(helloData); 이 코드에서 문제가 발생한것같은데 , 이유를 모르겠습니다. 실습코드와 동일하게 작성하였는데,, 혹시 이유가 무엇인지 알 수있을까요? 감사합니다! ====================================================== 2022-01-07 18:12:51.795 ERROR 12648 --- [nio-8080-exec-1] o.a.c.c.C.[.[.[/].[responseJsonServlet] : Servlet.service() for servlet [responseJsonServlet] in context with path [] threw exception com.fasterxml.jackson.databind.JsonMappingException: (was java.lang.NullPointerException) (through reference chain: hello.servlet.basic.HelloData["servletContext"]) at com.fasterxml.jackson.databind.JsonMappingException.wrapWithPath(JsonMappingException.java:392) ~[jackson-databind-2.13.1.jar:2.13.1] at com.fasterxml.jackson.databind.JsonMappingException.wrapWithPath(JsonMappingException.java:351) ~[jackson-databind-2.13.1.jar:2.13.1] at com.fasterxml.jackson.databind.ser.std.StdSerializer.wrapAndThrow(StdSerializer.java:316) ~[jackson-databind-2.13.1.jar:2.13.1] at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:782) ~[jackson-databind-2.13.1.jar:2.13.1] at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:178) ~[jackson-databind-2.13.1.jar:2.13.1] at com.fasterxml.jackson.databind.ser.DefaultSerializerProvider._serialize(DefaultSerializerProvider.java:480) ~[jackson-databind-2.13.1.jar:2.13.1] at com.fasterxml.jackson.databind.ser.DefaultSerializerProvider.serializeValue(DefaultSerializerProvider.java:319) ~[jackson-databind-2.13.1.jar:2.13.1] at com.fasterxml.jackson.databind.ObjectMapper._writeValueAndClose(ObjectMapper.java:4568) ~[jackson-databind-2.13.1.jar:2.13.1] at com.fasterxml.jackson.databind.ObjectMapper.writeValueAsString(ObjectMapper.java:3821) ~[jackson-databind-2.13.1.jar:2.13.1] at hello.servlet.basic.response.ResponseJsonServlet.service(ResponseJsonServlet.java:32) ~[classes/:na] at javax.servlet.http.HttpServlet.service(HttpServlet.java:764) ~[tomcat-embed-core-9.0.56.jar:4.0.FR] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:227) ~[tomcat-embed-core-9.0.56.jar:9.0.56] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) ~[tomcat-embed-core-9.0.56.jar:9.0.56] at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) ~[tomcat-embed-websocket-9.0.56.jar:9.0.56] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) ~[tomcat-embed-core-9.0.56.jar:9.0.56] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) ~[tomcat-embed-core-9.0.56.jar:9.0.56] at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) ~[spring-web-5.3.14.jar:5.3.14] at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) ~[spring-web-5.3.14.jar:5.3.14] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) ~[tomcat-embed-core-9.0.56.jar:9.0.56] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) ~[tomcat-embed-core-9.0.56.jar:9.0.56] at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) ~[spring-web-5.3.14.jar:5.3.14] at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) ~[spring-web-5.3.14.jar:5.3.14] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) ~[tomcat-embed-core-9.0.56.jar:9.0.56] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) ~[tomcat-embed-core-9.0.56.jar:9.0.56] at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) ~[spring-web-5.3.14.jar:5.3.14] at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) ~[spring-web-5.3.14.jar:5.3.14] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) ~[tomcat-embed-core-9.0.56.jar:9.0.56] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) ~[tomcat-embed-core-9.0.56.jar:9.0.56] at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:197) ~[tomcat-embed-core-9.0.56.jar:9.0.56] at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97) ~[tomcat-embed-core-9.0.56.jar:9.0.56] at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:540) ~[tomcat-embed-core-9.0.56.jar:9.0.56] at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:135) ~[tomcat-embed-core-9.0.56.jar:9.0.56] at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) ~[tomcat-embed-core-9.0.56.jar:9.0.56] at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78) ~[tomcat-embed-core-9.0.56.jar:9.0.56] at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:357) ~[tomcat-embed-core-9.0.56.jar:9.0.56] at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:382) ~[tomcat-embed-core-9.0.56.jar:9.0.56] at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) ~[tomcat-embed-core-9.0.56.jar:9.0.56] at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:895) ~[tomcat-embed-core-9.0.56.jar:9.0.56] at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1732) ~[tomcat-embed-core-9.0.56.jar:9.0.56] at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) ~[tomcat-embed-core-9.0.56.jar:9.0.56] at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191) ~[tomcat-embed-core-9.0.56.jar:9.0.56] at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659) ~[tomcat-embed-core-9.0.56.jar:9.0.56] at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) ~[tomcat-embed-core-9.0.56.jar:9.0.56] at java.base/java.lang.Thread.run(Thread.java:834) ~[na:na] Caused by: java.lang.NullPointerException: null at javax.servlet.GenericServlet.getServletContext(GenericServlet.java:123) ~[tomcat-embed-core-9.0.56.jar:4.0.FR] 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 com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:689) ~[jackson-databind-2.13.1.jar:2.13.1] at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:774) ~[jackson-databind-2.13.1.jar:2.13.1] ... 40 common frames omitted