다음과 같은 인터페이스가있는 프로젝트 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를 작성할 수 있다는 것을 알고 있지만 더 쉬운 방법이 있습니까?
당신은 추가 할 수 있습니다 @JsonDeserialize
에 MyClass
사용할 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;
}
@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