2013-03-15 2 views
2

Я пытаюсь сериализовать объект в массив, и Джексон не может это сделать с NPE.Джексон не сериализует null Double

Я ожидаю что-то вроде [1, null, 10] в ответе, но не понимаю, почему Джексон выбрасывает NPE вместо сериализации нулевого значения.

@JsonFormat(shape = JsonFormat.Shape.ARRAY) 
public static class PointTO { 
    private long x; 
    private Double y; 
    private int volume; 

    public PointTO(long x, Double y, int volume) { 
     this.x = x; 
     this.y = y; 
     this.volume = volume; 
    } 

    public long getX() { 
     return x; 
    } 

    public Double getY() { 
     return y; 
    } 

    public int getVolume() { 
     return volume; 
    } 
} 

Вот трассировки стека:

com.fasterxml.jackson.databind.JsonMappingException: (was java.lang.NullPointerException) (through reference chain: de.bnext.web.model.DisplayOrderBookResponseTO["curves"]->java.util.ArrayList[0]->de.bnext.web.model.CurveTO["points"]->java.util.ArrayList[15]->de.bnext.web.model.PointTO["y"]) 
    com.fasterxml.jackson.databind.JsonMappingException.wrapWithPath(JsonMappingException.java:232) 
    com.fasterxml.jackson.databind.JsonMappingException.wrapWithPath(JsonMappingException.java:197) 
    com.fasterxml.jackson.databind.ser.std.StdSerializer.wrapAndThrow(StdSerializer.java:183) 
    com.fasterxml.jackson.databind.ser.impl.BeanAsArraySerializer.serializeAsArray(BeanAsArraySerializer.java:192) 
    com.fasterxml.jackson.databind.ser.impl.BeanAsArraySerializer.serialize(BeanAsArraySerializer.java:147) 
    com.fasterxml.jackson.databind.ser.impl.IndexedListSerializer.serializeContents(IndexedListSerializer.java:94) 
    com.fasterxml.jackson.databind.ser.impl.IndexedListSerializer.serializeContents(IndexedListSerializer.java:21) 
    com.fasterxml.jackson.databind.ser.std.AsArraySerializerBase.serialize(AsArraySerializerBase.java:180) 
    com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:544) 
    com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:551) 
    com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:143) 
    com.fasterxml.jackson.databind.ser.impl.IndexedListSerializer.serializeContents(IndexedListSerializer.java:94) 
    com.fasterxml.jackson.databind.ser.impl.IndexedListSerializer.serializeContents(IndexedListSerializer.java:21) 
    com.fasterxml.jackson.databind.ser.std.AsArraySerializerBase.serialize(AsArraySerializerBase.java:180) 
    com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:544) 
    com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:551) 
    com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:143) 
    com.fasterxml.jackson.databind.ser.DefaultSerializerProvider.serializeValue(DefaultSerializerProvider.java:120) 
    com.fasterxml.jackson.databind.ObjectMapper.writeValue(ObjectMapper.java:1728) 
    org.springframework.http.converter.json.MappingJackson2HttpMessageConverter.writeInternal(MappingJackson2HttpMessageConverter.java:194) 
    org.springframework.http.converter.AbstractHttpMessageConverter.write(AbstractHttpMessageConverter.java:179) 
    org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodProcessor.writeWithMessageConverters(AbstractMessageConverterMethodProcessor.java:148) 
    org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodProcessor.writeWithMessageConverters(AbstractMessageConverterMethodProcessor.java:90) 
    org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.handleReturnValue(RequestResponseBodyMethodProcessor.java:189) 
    org.springframework.web.method.support.HandlerMethodReturnValueHandlerComposite.handleReturnValue(HandlerMethodReturnValueHandlerComposite.java:69) 
    org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:122) 
    org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:745) 
    org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:686) 
    org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:80) 
    org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:925) 
    org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:856) 
    org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:920) 
    org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:827) 
    javax.servlet.http.HttpServlet.service(HttpServlet.java:637) 
    org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:801) 
    javax.servlet.http.HttpServlet.service(HttpServlet.java:717) 
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:368) 
    org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:109) 
    org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:83) 
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380) 
    org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:97) 
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380) 
    org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:100) 
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380) 
    org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:54) 
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380) 
    org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:35) 
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380) 
    org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:105) 
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380) 
    org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:79) 
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380) 
    org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:169) 
    org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:346) 
    org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:259) 
+0

Я не пытаюсь десериализовать. Я сериализую Java-объект в JSON, используя Jackson. – afansky

ответ

0

Звучит как ошибка. Вы можете сообщить об этом по адресу:

https://github.com/FasterXML/jackson-databind/issues

вместе с информацией, как Джексон, который версию вы используете?

Как указано в сообщении об ошибке, похоже, что обработка свойства «y» не выполняется: я предполагаю, что это потому, что это объект-оболочка, а часть кода предполагает, что он может быть автоматически распакован в значение double. Поэтому проверка должна быть добавлена ​​в соответствующее место.

+0

Я думаю, что части «wrap» в stacktrace исходят от обработки исключений (wrapping). – botchniaque

+0

Да, вполне возможно. Тем не менее, отчет об ошибке был бы полезен, поскольку это для некоторого специализированного пути кода - сериализации POJO как массива JSON. Так что это может быть простой промах. Или, поскольку прошло какое-то время, возможно, новые версии могут решить проблему. – StaxMan

+0

Я думал, что сталкиваюсь с той же проблемой, но это оказалось ошибкой в ​​моей POJO, вызывающей NPE. Так как мы не знаем, какая версия Джексона @afansky используется, трудно выяснить, существует ли проблема. В случае, если это был Jackson 1.4, это могло быть проблемой http://jira.codehaus.org/browse/JACKSON-222. – botchniaque

Смежные вопросы