사용자 지정 jackson 일반 입력 된 빈 디시리얼라이저를 만들어야합니다. T는 IEntity를 구현하는 빈입니다. 클래스 이름을 기반으로 기업의잭슨 사용자 지정 일반 디시리얼라이저
public class RestLoaderRequestDeserializer extends JsonDeserializer<RestLoaderRequest<IEntity>> {
@Override
public RestLoaderRequest<IEntity> deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException, JsonProcessingException {
try {
ObjectCodec objectCodec = jp.getCodec();
JsonNode node = objectCodec.readTree(jp);
String className = node.get("className").textValue();
String fieldName = node.get("fieldName").textValue();
Class<?> clazz = Class.forName(className);
JsonNode rawEntityNode = node.get("entity");
// How to deserialize rawEntityNode to T based on className ?
RestLoaderRequest<IEntity> request = new RestLoaderRequest<IEntity>();
request.setClassName(className);
request.setFieldName(fieldName);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
return null;
}
}
1) 어떻게 할 수있는 자동 직렬화 :
public interface IEntity {
public int getId();
}
@JsonDeserialize(using = RestLoaderRequestDeserializer.class)
@Produces(MediaType.APPLICATION_JSON)
public class RestLoaderRequest<T extends IEntity> Serializable {
private T entity; // entity to load field to
private String className; // actual class of entity
private String fieldName; // fieldName to lazy REST load
// constructors(non parameter & all parameter), getters, setters, hashCode, equals, toString
}
지금 내가 가지고있는 것은 이것이다?
역 직렬화하려는 JSON을 제공 할 수 있습니까? – Eugen
"엔터티"필드가 전혀 직렬화되지 않았기 때문에 좋은 질문이었습니다. 나는 내 자신의 커스텀 시리얼 라이저를 작성한 다음 그것을 어떻게 비 직렬화 하는지를 알았다. 나중에 정답을 올리겠습니다. 하지만 답장을 보내 주셔서 감사합니다. – termil0r