Spring框架实体bean转json返回前端报错:Null key for a Map not allowed in JSON (use a converting NullKeySerializer

本文探讨了在项目开发中,遇到的Spring Boot通过接口查询分页时出现的Json写入错误,原因在于Map中的null键值。通过排查发现,罪魁祸首是查询结果中的自动生成的ROWNUM_字段未映射。解决方法是确保数据处理中避免null键的出现。
摘要由CSDN通过智能技术生成

在项目开发过程中,遇到如下问题,具体表现现象,调用接口查询第一页不报错,第二页就报错,详见报错信息:

  1. org.springframework.http.converter.HttpMessageNotWritableException: Could not write JSON: Null key for a Map not allowed in JSON (use a converting NullKeySerializer?); nested exception is com.fasterxml.jackson.databind.JsonMappingException: Null key for a Map not allowed in JSON (use a converting NullKeySerializer?) (through reference chain: java.util.LinkedHashMap["results"]->java.util.HashMap["rowsList"]->java.util.ArrayList[0])

  2. org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.writeInternal(AbstractJackson2HttpMessageConverter.java:293)

  3. org.springframework.http.converter.AbstractGenericHttpMessageConverter.write(AbstractGenericHttpMessageConverter.java:106)

  4. org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodProcessor.writeWithMessageConverters(AbstractMessageConverterMethodProcessor.java:231)

  5. org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.handleReturnValue(RequestResponseBodyMethodProcessor.java:174)

  6. org.springframework.web.method.support.HandlerMethodReturnValueHandlerComposite.handleReturnValue(HandlerMethodReturnValueHandlerComposite.java:81)

  7. org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:113)

  8. org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:827)

  9. org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:738)

  10. org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85)

  11. org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:967)

  12. org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:901)

  13. org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970)

  14. org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:872)

  15. javax.servlet.http.HttpServlet.service(HttpServlet.java:644)

  16. org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846)

  17. javax.servlet.http.HttpServlet.service(HttpServlet.java:725)

  18. org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:291)

  19. org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)

  20. org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)

  21. org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)

  分析过程:后端代码没有任何错误,数据也都查询得到,但是只要分页就报错。

  分析上面的错误,我们发现这是Spring最后将对象json化的时候报错,这是第一步,发现Could not write JSON: Null key for a Map not allowed in JSON

  大概意思就是说map中有null的key值存在,不能json化,但是我能确认肯定没有这样的key值存在,然后一步步排查,发现了罪魁祸首,查询的结果多了【ROWNUM_】这样一个字段。

  而这个字段在我们自己的处理中没有映射(数据库查询到的是英文,业务需求返回中文,做了一个方法来映射),最后返回了null,导致了错误。

  我们继续分析为什么出现了这个字段,原来在使用Query的setFirstResult,setMaxResults作为分页的时候,会自动生成一个ROWNUM_,自此所有分析结束。

  导致这个错误的原因就是:我们需要json化的map中存在null。

  解决方法:排查在哪个过程存入的key值,去除掉就好。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值