自定义Jackson反序列化程序中的java委托
情况如下:我已经设法让Jackson反序列化了以下泛型ResponseWrapper<T>
static final class ResponseWrapper<T> {
private ResponseData <T> response;
protected static final class ResponseData<T> {
private int status;
private T data;
}
}
使用以下ParameterizedTypeReference
public static <T> ParameterizedTypeReference <ResponseWrapper<T>> typeReferenceOf ( Class<T> tClass ) {
return ParameterizedTypeReference.forType( ParameterizedTypeImpl.make( ResponseWrapper.class, new Type[]{ tClass }, null ) );
}
问题:我需要处理这样一种情况:T
的反序列化将失败,因为data
的值将不是一个对象,而是一个String
。我需要捕获异常并将该值分配给ResponseData
中的另一个属性,例如String errorMessage
。我的想法是用@JsonDeserialize( using = ResponseDeserializer.class )
注释response
属性,但我不知道如何正确地实现JsonDeserializer
,以便它将反序列化委托给Jackson的实现,并在异常发生时捕获异常
关于更多的上下文,我使用WebClient
作为HTTP客户机,并使用进行反序列化的交换Function<ClientResponse, Mono<ResponseWrapper<T>>
处理响应
# 1 楼答案
为了获得泛型类型,我有
ResponseDeserializer
实现ContextualDeserializer
这使我能够使用特定的
JavaType
创建反序列化程序的具体实例。以下是完整的解决方案: