2017-02-11 93 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

相關問題