Spring

JsonSubTypes없이 jackson을 사용하여 인터페이스를 특정 유형으로 역 직렬화

기록만이살길 2021. 3. 6. 03:04
반응형

JsonSubTypes없이 jackson을 사용하여 인터페이스를 특정 유형으로 역 직렬화

1. 질문(문제점):

다음과 같은 인터페이스가있는 프로젝트 A가 있습니다.

interface MyInterface extends Serializable { }

다른 프로젝트 BI에는 해당 인터페이스를 구현하는 클래스가 있습니다.

@Data
class MyClass implements MyInterface {
    private String someProp;
}

지금은 내가 모든 모습 직렬화하는 것을 잭슨에게하고 싶은 MyInterface등을 MyClass. 일반적으로 사용할 수 있다는 것을 알고 JsonSubTypes있지만이 경우 프로젝트 A는 프로젝트 B를 모릅니다.

유형에 대한 기본 deserializer를 얻는 방법이 있습니까? 그런 다음 다음과 같이 할 수 있습니다.

SimpleModule module = new SimpleModule();
module.addDeserializer(MyInterface.class, DefaultDeserializerForMyClass);

정확히 똑같은 작업을 수행하는 사용자 지정 deserializer를 작성할 수 있다는 것을 알고 있지만 더 쉬운 방법이 있습니까?

2. 해결방안:

당신은 추가 할 수 있습니다 @JsonDeserializeMyClass사용할 ObjectMapper.addMixIn()MyInterface대상으로.

public ObjectMapper addMixIn (클래스 타겟, 클래스 mixinSource)

지정된 클래스 또는 인터페이스를 보강하는 데 사용할 믹스 인 어노테이션을 추가하는 데 사용하는 방법입니다. mixinSource의 모든 어노테이션은 대상 (또는 해당 상위 유형)에있는 어노테이션을 재정의하는 데 사용됩니다.

target-효과적으로 mixinSource를 대체 할 어노테이션이있는 클래스 (또는 인터페이스)-어노테이션이 대상의 어노테이션에 "추가"되어야하는 클래스 (또는 인터페이스), 필요에 따라 대체

예를 들면 :

import com.fasterxml.jackson.databind.annotation.JsonDeserialize;

@JsonDeserialize(as = MyClass.class)
class MyClass implements MyInterface
{
        private String someProp;

        /* getters and setters */
}

@Bean
public ObjectMapper objectMapper()
{
        ObjectMapper om = new ObjectMapper();
        om.addMixIn(MyInterface.class, MyClass.class);
        return om;
}

@PostMapping
public String foo(@RequestBody MyInterface bar)
{
        if (bar instanceof MyClass) {
                MyClass baz = (MyClass)bar;
                System.out.println(baz.getSomeProp());
                return "world"
        }
        return "goodbye"
}

$ curl -X POST -d '{"someProp": "hello"}' -H "content-type: application/json" localhost:8080
world

서버가 올바르게 인쇄합니다.

hello
65742615
반응형