2017-02-11 116 views
1

我正面临一个很奇怪的问题。我在我的序列化应用程序中使用Jackson数据绑定2.7.4版。应用程序运行正常了很多天,但有时它开始抛出数据序列化错误(说明是类似于JsonMappingException: (was java.lang.ArrayIndexOutOfBoundsException)序列化时JsonMappingException:(was java.lang.ArrayIndexOutOfBoundsException)

出现这种情况随机开始使用自定义序列化序列化日期字段时,抛出ArrayOutOfBoundException。

异常跟踪

R] 2017-02-11 23:39:16 ERROR GlobalExceptionHandlerController:171 - Trace for 500:org.springframework.http.converter.HttpMessageNotWritableException: Could not write content: (was java.lang.ArrayIndexOutOfBoundsException) (through reference chain: com.mycompany.model.DTO.ApiResponse["data"]->com.mycompany.model.Entity["date"]); nested exception is com.fasterxml.jackson.databind.JsonMappingException: (was java.lang.ArrayIndexOutOfBoundsException) (through reference chain: com.mycompany.model.DTO.ApiResponse["data"]->com.mycompany.model.Entity["date"]) 
at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.writeInternal(AbstractJackson2HttpMessageConverter.java:276) 
at org.springframework.http.converter.AbstractGenericHttpMessageConverter.write(AbstractGenericHttpMessageConverter.java:100) 
at org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodProcessor.writeWithMessageConverters(AbstractMessageConverterMethodProcessor.java:222) 
at org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodProcessor.writeWithMessageConverters(AbstractMessageConverterMethodProcessor.java:153) 
at org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.handleReturnValue(RequestResponseBodyMethodProcessor.java:165) 
at org.springframework.web.method.support.HandlerMethodReturnValueHandlerComposite.handleReturnValue(HandlerMethodReturnValueHandlerComposite.java:81) 
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:126) 
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:832) 
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:743) 
at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85) 
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:961) 
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:895) 
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:967) 
at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:858) 
at javax.servlet.http.HttpServlet.service(HttpServlet.java:622) 
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:843) 
at javax.servlet.http.HttpServlet.service(HttpServlet.java:729) 
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:292) 
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207) 
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) 
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240) 
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207) 
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:212) 
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106) 
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:141) 
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79) 
at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:616) 
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88) 
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:528) 
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1099) 
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:670) 
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1520) 
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1476) 
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) 
at java.lang.Thread.run(Thread.java:745) 
Caused by: com.fasterxml.jackson.databind.JsonMappingException: (was java.lang.ArrayIndexOutOfBoundsException) (through reference chain: com.mycompany.model.DTO.ApiResponse["data"]->com.mycompany.model.Entity["date"]) 
    at com.fasterxml.jackson.databind.JsonMappingException.wrapWithPath(JsonMappingException.java:378) 
    at com.fasterxml.jackson.databind.JsonMappingException.wrapWithPath(JsonMappingException.java:338) 
    at com.fasterxml.jackson.databind.ser.std.StdSerializer.wrapAndThrow(StdSerializer.java:342) 
    at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:686) 
    at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:157) 
    at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:672) 
    at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:678) 
    at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:157) 
    at com.fasterxml.jackson.databind.ser.DefaultSerializerProvider.serializeValue(DefaultSerializerProvider.java:130) 
    at com.fasterxml.jackson.databind.ObjectWriter$Prefetch.serialize(ObjectWriter.java:1428) 
    at com.fasterxml.jackson.databind.ObjectWriter.writeValue(ObjectWriter.java:930) 
    at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.writeInternal(AbstractJackson2HttpMessageConverter.java:269) 
    ... 36 more 
Caused by: java.lang.ArrayIndexOutOfBoundsException 

这似乎是一个共享变量越来越负值,造成这个问题,但我不能够识别的代码。

实体类

public class Entity { 
    @JsonSerialize(using=CustomDateSerializer.class) 
    @JsonDeserialize(using=CustomDateDeserializer.class) 
    private Date date; 

    public Entity(){} 

    public Date getDate() { 
     return date; 
    } 
    public void setDate(Date date) { 
     this.date = date; 
    }  
} 

解串

public class CustomDateDeserializer extends JsonDeserializer<Date>{ 

    private SimpleDateFormat formatter = 
       new SimpleDateFormat("dd-MM-yyyy hh:mm:ss"); 
    @Override 
    public Date deserialize(JsonParser p, DeserializationContext ctxt) throws IOException, JsonProcessingException { 
     Date date=null; 
     String str=p.getText(); 
     try{ 
      date=formatter.parse(str); 
     }catch(ParseException e){ 
      throw new RuntimeException(e); 
     } 
     return date; 
    }  
} 

串行

public class CustomDateSerializer extends JsonSerializer<Date>{ 

     private SimpleDateFormat formatter = 
      new SimpleDateFormat("dd-MM-yyyy hh:mm:ss"); 

     @Override 
     public void serialize (Date value, JsonGenerator gen, SerializerProvider arg) 
      throws IOException, JsonProcessingException { 
      gen.writeString(formatter.format(value)); 
     } 

} 

任何帮助将AP preciated。

+0

很可能是您的自定义序列化程序中的一个问题。但是,当它变得有趣时,你会削减堆栈跟踪,并且你公布了反序列化器的代码:)你可以提供它们两个吗? –

+0

@ FabienBenoit-Koch:我添加了序列化程序代码。我粘贴了原木中的完整痕迹。您可以向右滚动以获取详细信息。 – Learner

+0

根本原因后我看不到任何东西:由于:java.lang.ArrayIndexOutOfBoundsException –

回答

4

SimpleDateFormat是不是线程安全的,在其javadoc提到:

日期格式不同步。建议为每个线程创建 单独的格式实例。如果多个线程同时访问格式 ,则它必须在外部同步。

This blog post演示该问题,并列出了选择可能遇到的,其中ArrayIndexOutOfBoundsException错误的,如果上述建议没有遵循。

我建议同步日期格式化程序实例。最简单的方法看起来是这样的:

public void serialize (Date value, JsonGenerator gen, SerializerProvider arg) 
    throws IOException, JsonProcessingException { 
    synchronized(formatter) { 
     gen.writeString(formatter.format(value)); 
    } 
} 

编辑:如果您使用的是Java 8,可以考虑使用线程安全的DateTimeFormatter类代替。

+1

这应该是公认的答案 – eze

相关问题