项目中需要用到jackson对对象进行序列化,对象中有日期字段,需要通过@JsonSerialize 注解来进行定制化序列化.
Pojo:
@JsonSerialize(using = XMLGregorianCalendar2StringSerializer.class)
private XMLGregorianCalendar fromDate;
自定义序列化方法:
public class XMLGregorianCalendar2StringSerializer extends JsonSerializer<XMLGregorianCalendar> {
@jOverride
public void serialize(XMLGregorianCalendar xmlGregorianCalendar, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
jsonGenerator.writeString(xmlGregorianCalendar.toString());
}
}
序列化:
ObjectMapper mapper = new ObjectMapper();
mapper.writeValueAsString(pojo)
测试中发现,自定义的序列化方法没有起作用,将断点放在自定义序列化方法上,代码未走到断点处,可以判断,该序列化方法没有被调用。
另外开一个新工程,用上述代码,可以正常执行自定义序列化方法。这种错误让笔者百思不得其解。
于是对比两个工程的文件,发现了问题所在:
在老工程中,ObjectMapper引入的是org.codehaus.jackson.map.ObjectMapper, 而新工程中,ObjectMapper引入的是com.fasterxml.jackson.databind.ObjectMapper,至此,问题得到解决。
究其原因,是笔者的老工程中使用了jersey包,里面包含了org.codehaus.jackson.map.ObjectMapper,笔者在使用IDE自动导入时,没有注意,就直接敲了回车,导致了问题产生。