반응형
Json 데이터를 자바 객체로 역직렬화할 때 발생할 수 있는 문제가 있습니다.
1. Snake case를 Camel Case 케이스로 받으려고 할 때
2. Enum type으로 역직렬화될 때 전달받은 값이 설정된 enum 값과 다른 경우
@JsonProperty
Request JSON
{
"my_name": "foobar"
}
Entity
public class Student {
private String myName;
}
DTO
public class StudnetDTO {
@JsonProperty("my_name")
private String myName;
}
- my_name → myName으로 치환해주어 값을 제대로 받습니다.
- @JsonProperty("value") : value로 설정한 값을 myName으로 받습니다.
@JsonCreator
- Jackson 라이브러리에서 JSON 데이터를 역직렬화할 때 사용
- 이 어노테이션이 지정된 메서드는 JSON 데이터에서 가져온 값을 객체로 변환할 때 사용합니다.
- 주로 생성자나 팩토리 메서드에 사용됨
- Request DTO에 Enum 타입을 받을 때, Jackson에서 제공하는 Default EnumDeserializer 외에 내가 설정한 역직렬화 적용
Controller
@RestController
public class TestController {
@PostMapping("/hello")
public String matchEnumTest(@RequestBody RequestDto requestDto){
return "hello world";
}
}
Request DTO
@Getter
public class RequestDto {
private TestEnum testEnum;
}
Enum Class
public enum TestEnum {
TEST1,
TEST2
;
@JsonCreator
public static TestEnum fromTestEnum(String val){
for(TestEnum testEnum : TestEnum.values()){
if(testEnum.name().equals(val)){
return testEnum;
}
}
return null;
}
}
- 컨트롤러에서는 RequestDto를 받아오고, testEnum이라는 필드를 가지고 있습니다.
- 기본적으로 json body를 받을때, json to object 과정에서 deserialize는 Jackson라이브러리에서 실행됩니다.
- 이 경우 enum value의 name과 완전 동일한 경우, 기본 deserialize가 있기에 문제는 없으나, 변수가 조금이라도 틀리게 되면 바로 에러를 맞이하게 됩니다. (“JSON parse error: Cannot deserialize value of type enum package")
- 해당 에러를 맞이하지 않고, 내가 지정한 setter를 사용하게끔 @JsonCreator라는 어노테이션을 사용합니다.
반응형
'Spring Framework > Spring boot' 카테고리의 다른 글
[Spring] H2 In-memory 데이터베이스 설정 및 접속 방법 (3) | 2024.10.05 |
---|---|
[Springboot] 스프링부트 HttpInterface 사용법 및 이해하기 - @HttpExchange, @GetExchange (2) | 2024.09.08 |
[Spring&WebSocket] 스프링 STOMP를 통한 채팅 서비스 개발하기 - websocket (0) | 2024.08.27 |
[SpringBoot] 스프링부트 @Transactional 개념 및 사용법 - Required, requires_new (0) | 2024.08.22 |
Spring Batch JobBuilder와 StepBuilder로 데이터 마이그레이션 - ID 충돌 해결 방법 (0) | 2024.07.21 |