我试图在Spring中编写自定义JSON反序列化器.我想在大多数字段中使用默认序列化程序,并为少数属性使用自定义反序列化程序.可能吗?我这样做是因为,大部分属性都是值,所以对于这些我可以让杰克逊使用默认的反序列化器; 但很少有属性是引用,所以在自定义反序列化器中,我必须查询数据库以获取引用名称并从数据库中获取引用值.
如果需要,我会展示一些代码.
我使用Spring的MappingJacksonHttpMessageConverter将JSON消息转换为我的控制器中的对象.
<bean id="jsonConverter"
    class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter">
    <property name="prefixJson" value="false" />
    <property name="supportedMediaTypes" value="application/json" />
</bean>
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
    <property name="messageConverters">
        <list>
            <ref bean="jsonConverter" />
        </list>
    </property>
</bean>
对于声明为ArrayList的字段,如果json消息包含String,则将抛出以下异常:
org.springframework.http.converter.HttpMessageNotReadableException: 
 Could not read JSON: Can not deserialize instance of java.util.ArrayList out of VALUE_STRING token
一个例子是下面的类定义:
public class Product {
   private String name;
   private List<String> images;
}
传入Json的地方是:
{name:"Widget", images:"image1.jpg"}
如您所见,这将产生异常,因为图像应该是一个数组.
我想制作一个更宽容的自定义反序列化器.如果反序列化失败,请从String中创建单个元素的ArrayList.我如何将其注入MappingJacksonHttpMessageConverter或ObjectMapper?
我不打算使用注释来标记每个ArrayList字段,因此可以使用自定义反序列化. 我正在寻找一种方法来覆盖默认的反序列化器以执行此功能.