2016-06-27 33 views
0

看到调用writeValueAsString()马歇尔为JSON定期时抛出周期性异常......但重试的时候,他们总是工作...杰克逊writeValueAsString()抛出JsonMappingException定期

这是由杰克逊的API(v2.7.5)抛出在解析时/编组(非空)的Java日期值JSON ...

这里是我们的配置,它定义的类水平,在多个线程重用/请求

private ObjectMapper mapper = new ObjectMapper(); 
mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); 

和完整堆栈跟踪。 ..

com.fasterxml.jackson.databind.JsonMappingException: (was java.lang.ArrayIndexOutOfBoundsException) (through reference chain: MyIndex["createdAt"]) 
at com.fasterxml.jackson.databind.JsonMappingException.wrapWithPath(JsonMappingException.java:232) 
at com.fasterxml.jackson.databind.JsonMappingException.wrapWithPath(JsonMappingException.java:197) 
at com.fasterxml.jackson.databind.ser.std.StdSerializer.wrapAndThrow(StdSerializer.java:186) 
at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:640) 
at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:152) 
at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:541) 
at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:632) 
at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:152) 
at com.fasterxml.jackson.databind.ser.DefaultSerializerProvider.serializeValue(DefaultSerializerProvider.java:114) 
at com.fasterxml.jackson.databind.ObjectMapper._configAndWriteValue(ObjectMapper.java:2811) 
at com.fasterxml.jackson.databind.ObjectMapper.writeValueAsString(ObjectMapper.java:2268) 
+4

我不知道我怎么看这是一个重复,@JarrodRoberson 。他有一些使用Jackson序列化为JSON的对象。杰克逊抛出了这个例外,而不是他的代码,那么他会在哪里检查他的索引? – DavidS

+0

'ObjectMapper'在序列化时是线程安全的。你的POJO是在线程之间共享的吗? –

+1

你在使用杰克逊本的最新版本吗?它看起来像过去一些ArrayIndexOutOfBounds异常已被修复... – DavidS

回答

0

进一步的测试表明,根本原因是在杰克逊被序列化类的getter方法非线程安全使用SimpleDateFormatter的...所以杰克逊打爆(我回来就可以了)。 ..

更改为使用ThreadLocal<DateFormat>,一切都很好...

public class ThreadLocalDateFormat extends ThreadLocal<DateFormat> 
{ 
    private String dateFormat; 

    public ThreadLocalDateFormat(String dateFormat) 
    { 
     this.dateFormat = dateFormat; 
    } 

    @Override 
    protected DateFormat initialValue() 
    { 
     return new SimpleDateFormat(dateFormat); 
    } 
} 

感谢您的帮助......