자주 나오는 질문 - DTO에 @Allargs, @Noargs 문제
882
작성한 질문수 3
실행할 때 IntelliJ IDEA 가 아닌 Gradle로 돌려야 합니다
답변 1
0
해당 질문이 많이 나와서, 찾아 봤었는데 버전이나 환경, 세팅에 따라서 다른것 같고, 추가적인 어노테이션을 붙이는걸로 가이드 드렸었는데 원인이 저 부분이었군요!!
공유해주셔서 감사합니다. 다른분들한테도 많이 도움이 될꺼 같네요!
1
저 문제가 원인일 수도 있고, 아닐 수도 있는 것 같더라고요.. 그래서 정리해봤습니다.
틀린 부분 있으면 피드백 부탁드립니다!
@RequestBody
파라미터에 @RequestBody가 있으면
스프링은 RequestResponseBodyMethodProcessor(ArgumentResolver)가 MappingJackson2HttpMessageConvertor를 이용해서 역직렬화를 수행하는데,
이때 기본적으로는 기본 생성자로 DTO를 생성해서 기본생성자가 필요합니다.
하지만 @JsonProperty, @JsonAutoDetect 등을 이용한 Property 기반 클래스이거나, 생성자가 위임된 경우라면 필요하지 않습니다.
하지만 다음과 같이 애노테이션을 사용하면 문제가 될 수 있는게, 명시된 기본 생성자가 없을 때 @Builder 애노테이션을 사용하면 @AllArgsConstructor(access = AccessLevel.PRIVATE)이 붙게 됩니다.
따라서 기본 생성자가 만들어지지 않고, 역직렬화 시 기본 생성자가 없어 역직렬화 에러가 발생합니다.
@Builder를 제거해주면 됩니다.
리플렉션을 사용해 필드에 값을 넣어주므로, @Getter와 @Setter 둘 중 하나만 있으면 됩니다.
기본 생성자만 있고 getter 가 없다면, deserialize 불가능합니다.
기본적으로 Jackson은 JSON 필드의 이름을 Java 오브젝트의 getter 및 setter 메서드와 일치시켜 JSON 오브젝트의 필드를 Java 오브젝트의 필드에 매칭합니다. Jackson은 getter 및 setter 메서드 이름의 "get" 및 "set" 부분을 제거하고 나머지 이름의 첫 문자를 소문자로 변환합니다.
예를 들어 brand라는 JSON 필드는 getBrand() 및 setBrand() 라는 Java getter 및 getter 메서드와 일치합니다. engineNumber라는 JSON 필드는 getEngineNumber() 및 setEngineNumber()라는 getter 및 setter와 일치합니다.
다른 방식으로 JSON object 필드를 Java object 필드와 일치시켜야 하는 경우 custom serializer 및 deserializer를 사용하거나 많은 Jackson Annotation 중 일부를 사용해야 합니다.
라고 나와있습니다.
@ResponseBody
객체를 Json으로 직렬화할 때는 @Getter가 필요합니다
(정리한 내용은 기본적으로 인스턴스 변수가 private일 때를 가정한 것입니다. Getter 없이도 public이면 직렬화가 가능합니다)
출처
OAUTH2 질문
0
96
2
카카오토큰관련
0
82
2
auditing
0
76
1
전역에러처리질문
0
115
2
토큰 발급 관련 문의 드립니다.
0
131
2
이 흐름이 맞을까요??
0
126
2
OpenFeign을 어떤 상황에서 어떻게 사용하는지 감이 안옵니다...
0
220
2
도메인형 패키지 구조 질문
0
242
1
application.yml token 선언 시 오류
0
322
1
토큰발행시 500 INTERNAL_SERVER_ERROR
0
158
1
oauth 회원가입 시 필수 추가 정보는 어떤 식으로 받으시나요?
0
288
2
io.jsonwebtoken.security.WeakKeyException 해결방법
0
387
1
리프레시 토큰 사용 관련 문의 건
0
336
1
Xss 에서 WebConfig 오류 발생됩니다.
0
673
1
applycation.yml 의 readTimeout 이 적용이 안됩니다.
0
697
2
강사님 Swagger에 질문드립니다.
0
294
2
kakao token 발급 시 에러
0
729
2
아직 초반부분인데 질문이있습니다.
0
204
1
socialLoginApiService map 주입
0
291
1
전역 에러 처리 메시지 관리
0
608
2
안드로이드 스튜디오와 협업
0
646
2
String accessToken = authorizationHeader.split(" ")[1];은 accessToken이 맞나요?
0
312
1
SocialLoginApiServiceFactory 생성자 관련 질문입니다.
0
256
1
OAuthAttributes 클래스의 toMemberEntity의 파라미터로 memberType이 들어가야하는 이유가 궁금합니다.
0
445
2





