【问题标题】:Jackson fails to serialize a null DoubleJackson 无法序列化 null Double
【发布时间】:2013-03-15 11:08:27
【问题描述】:

我正在尝试将一个对象序列化为一个数组,而 Jackson 使用 NPE 未能做到这一点。

我期待响应中出现类似 [1, null, 10] 的内容,但不明白 Jackson 为什么会抛出 NPE 而不是序列化 null 值。

@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)

【问题讨论】:

  • 我不想反序列化。我正在使用 Jackson 将 java 对象序列化为 JSON。

标签: java json jackson


【解决方案1】:

听起来像一个错误。您可以通过以下方式举报吗:

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

以及您正在使用的 Jackson 版本等信息?

正如错误消息所示,属性“y”处理似乎失败了:我猜这是因为它是一个包装器对象,并且部分代码假定它可以自动拆箱为double 值。所以需要在适当的地方添加一个检查。

【讨论】:

  • 我认为堆栈跟踪中的“包装”部分来自异常处理(包装)。
  • 是的,很可能。不过,一个错误报告会很有帮助,因为这是一些专门的代码路径——将 POJO 序列化为 JSON 数组。所以这可能是一些简单的疏忽。或者,由于已经有一段时间了,新版本也可能已经解决了这个问题。
  • 我以为我面临同样的问题,但结果证明是我的 POJO 中的一个错误导致 NPE。由于我们不知道@afansky 一直在使用哪个 Jackson 版本,因此很难找出问题是否存在。如果是 Jackson 1.4,这可能是问题jira.codehaus.org/browse/JACKSON-222
猜你喜欢
  • 2021-01-17
  • 2019-05-17
  • 2017-01-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-24
  • 2018-11-14
  • 1970-01-01
相关资源
最近更新 更多