부자 되기 위한 블로그, 머니킹

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"'.