jackson 사용중에 json string to object를 하는중 위와 같은 오류가 발생하였다. 해결하는 방법에 대해서 공유하고자 한다.
오류 내용
cannot deserialize from Object value (no delegate- or property-based Creator) |
대충 객체를 직렬화 할 수 없다는 것이다. 이는 문법적인 오류는 아니고 jackson 라이브러리 자체가 빈 생성자가 없는 객체를 인식하지 않는다고 한다. 따라서 객체에서 빈 생성자를 추가해주면된다.
오류 해결
Java class 객체
package com.example.demo.domain;
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
public class User {
private String name;
private int age;
public User() {
}
public User(String name, int age) {
this.name = name;
this.age = age;
}
}
원래는 생성자가 아래거 하나였는데 빈 생성자를 하나 추가해주었다.
Java Jackson Test 부분
package com.example.demo.domain;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.json.JSONObject;
import org.junit.jupiter.api.Test;
import java.io.File;
import java.io.IOException;
import static org.junit.jupiter.api.Assertions.*;
class UserTest {
@Test
public void jacksonTest() {
User user = new User("hello", 30);
ObjectMapper objectMapper = new ObjectMapper();
try{
String memberJsonString = objectMapper.writeValueAsString(user);
System.out.println("memberJsonString = " + memberJsonString);
String json = "{\"name\":\"hello\",\"age\":30}";
User user1 = objectMapper.readValue(json, User.class);
System.out.println("user1 = " + user1.getName());
}catch(IOException e){
System.out.println("e = " + e);
}
}
}
결과
> Task :compileJava
> Task :processResources UP-TO-DATE
> Task :classes
> Task :compileTestJava
> Task :processTestResources NO-SOURCE
> Task :testClasses
> Task :test
memberJsonString = {"name":"hello","age":30}
user1 = hello
BUILD SUCCESSFUL in 1s
4 actionable tasks: 3 executed, 1 up-to-date
11:22:53 AM: Execution finished ':test --tests "com.example.demo.domain.UserTest.jacksonTest"'.