项目记事【SpringMVC-2】:将后台的对象,转成JSON报文
发布日期:2021-05-09 03:59:04 浏览次数:14 分类:博客文章

本文共 11685 字,大约阅读时间需要 38 分钟。

Spring版本:3.2.7

 

Jackson版本:

1 
2
3
com.fasterxml.jackson.core
4
jackson-databind
5
2.1.3
6
7
8
com.fasterxml.jackson.core
9
jackson-core
10
2.1.3
11
12
13
com.fasterxml.jackson.core
14
jackson-annotations
15
2.1.2
16
POM文件配置

 

背景:

需要将后端的一个对象,通过SPringMVC框架,传递到前端时,自动转换成对应的JSON格式报文。

 

堆栈信息:

org.springframework.http.converter.HttpMessageNotWritableException: Could not write JSON: No serializer found for class org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationConfig.SerializationFeature.FAIL_ON_EMPTY_BEANS) ) (through reference chain: com.siebre.pms.common.model.ResponseVO["data"]->com.siebre.pms.template.model.LiabilityTemplateDO["propertyAssignments"]->org.hibernate.collection.PersistentBag[0]->com.siebre.pms.template.model.PropertyAssignmentTemplateDO["propertyTemplate"]->com.siebre.pms.template.model.PropertyTemplateDO_$$_javassist_187["handler"]); nested exception is com.fasterxml.jackson.databind.JsonMappingException: No serializer found for class org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationConfig.SerializationFeature.FAIL_ON_EMPTY_BEANS) ) (through reference chain: com.siebre.pms.common.model.ResponseVO["data"]->com.siebre.pms.template.model.LiabilityTemplateDO["propertyAssignments"]->org.hibernate.collection.PersistentBag[0]->com.siebre.pms.template.model.PropertyAssignmentTemplateDO["propertyTemplate"]->com.siebre.pms.template.model.PropertyTemplateDO_$$_javassist_187["handler"])    at org.springframework.http.converter.json.MappingJackson2HttpMessageConverter.writeInternal(MappingJackson2HttpMessageConverter.java:207)    at org.springframework.http.converter.AbstractHttpMessageConverter.write(AbstractHttpMessageConverter.java:179)    at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter$ServletHandlerMethodInvoker.writeWithMessageConverters(AnnotationMethodHandlerAdapter.java:1037)    at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter$ServletHandlerMethodInvoker.handleResponseBody(AnnotationMethodHandlerAdapter.java:995)    at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter$ServletHandlerMethodInvoker.getModelAndView(AnnotationMethodHandlerAdapter.java:944)    at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:441)    at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter.java:428)    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:925)    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:856)    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:953)    at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:844)    at javax.servlet.http.HttpServlet.service(HttpServlet.java:627)    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:829)    at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:269)    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)    at com.siebre.web.servlet.filter.CorsFilter.doFilter(CorsFilter.java:53)    at com.siebre.web.servlet.filter.CorsFilter.doFilter(CorsFilter.java:34)    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:215)    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)    at com.siebre.webapp.filter.WindowContextFilter.doFilterInternal(WindowContextFilter.java:274)    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:215)    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)    at org.springframework.security.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:378)    at org.springframework.security.intercept.web.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:109)    at org.springframework.security.intercept.web.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:83)    at org.springframework.security.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:390)    at org.springframework.security.ui.SessionFixationProtectionFilter.doFilterHttp(SessionFixationProtectionFilter.java:67)    at org.springframework.security.ui.SpringSecurityFilter.doFilter(SpringSecurityFilter.java:53)    at org.springframework.security.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:390)    at org.springframework.security.ui.ExceptionTranslationFilter.doFilterHttp(ExceptionTranslationFilter.java:101)    at org.springframework.security.ui.SpringSecurityFilter.doFilter(SpringSecurityFilter.java:53)    at org.springframework.security.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:390)    at org.springframework.security.providers.anonymous.AnonymousProcessingFilter.doFilterHttp(AnonymousProcessingFilter.java:105)    at org.springframework.security.ui.SpringSecurityFilter.doFilter(SpringSecurityFilter.java:53)    at org.springframework.security.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:390)    at org.springframework.security.ui.rememberme.RememberMeProcessingFilter.doFilterHttp(RememberMeProcessingFilter.java:116)    at org.springframework.security.ui.SpringSecurityFilter.doFilter(SpringSecurityFilter.java:53)    at org.springframework.security.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:390)    at org.springframework.security.wrapper.SecurityContextHolderAwareRequestFilter.doFilterHttp(SecurityContextHolderAwareRequestFilter.java:91)    at org.springframework.security.ui.SpringSecurityFilter.doFilter(SpringSecurityFilter.java:53)    at org.springframework.security.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:390)    at com.siebre.security.ui.ClientLoginProcessingFilter.doFilterHttp(ClientLoginProcessingFilter.java:147)    at org.springframework.security.ui.SpringSecurityFilter.doFilter(SpringSecurityFilter.java:53)    at org.springframework.security.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:390)    at org.springframework.security.ui.basicauth.BasicProcessingFilter.doFilterHttp(BasicProcessingFilter.java:174)    at org.springframework.security.ui.SpringSecurityFilter.doFilter(SpringSecurityFilter.java:53)    at org.springframework.security.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:390)    at org.springframework.security.ui.AbstractProcessingFilter.doFilterHttp(AbstractProcessingFilter.java:277)    at org.springframework.security.ui.SpringSecurityFilter.doFilter(SpringSecurityFilter.java:53)    at org.springframework.security.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:390)    at org.springframework.security.ui.logout.LogoutFilter.doFilterHttp(LogoutFilter.java:89)    at org.springframework.security.ui.SpringSecurityFilter.doFilter(SpringSecurityFilter.java:53)    at org.springframework.security.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:390)    at org.springframework.security.context.HttpSessionContextIntegrationFilter.doFilterHttp(HttpSessionContextIntegrationFilter.java:235)    at org.springframework.security.ui.SpringSecurityFilter.doFilter(SpringSecurityFilter.java:53)    at org.springframework.security.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:390)    at org.springframework.security.util.FilterChainProxy.doFilter(FilterChainProxy.java:175)    at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:343)    at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:260)    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:215)    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)    at org.springframework.orm.hibernate3.support.OpenSessionInViewFilter.doFilterInternal(OpenSessionInViewFilter.java:230)    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:215)    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)    at com.siebre.webapp.filter.CacheControlFilter.doFilter(CacheControlFilter.java:34)    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:215)    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)    at com.siebre.webapp.filter.SetCharacterEncodingFilter.doFilter(SetCharacterEncodingFilter.java:29)    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:215)    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:172)    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:117)    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:108)    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:174)    at org.apache.coyote.http11.Http11AprProcessor.process(Http11AprProcessor.java:845)    at org.apache.coyote.http11.Http11AprProtocol$Http11ConnectionHandler.process(Http11AprProtocol.java:688)    at org.apache.tomcat.util.net.AprEndpoint$Worker.run(AprEndpoint.java:1315)    at java.lang.Thread.run(Thread.java:595)

 

错误原因分析:

后端对象中,有部分对象是以懒加载的形式初始化的,在ObjectMapper将对象转为JSON时,这部分对象尚未初始化,报错。

 

解决方案分析:

这种情况,在Jackson设计的时候,一定会考虑到。

通过堆栈信息,不难发现,这个转换工作,是由框架的 MappingJackson2HttpMessageConverter 这个类完成。

通过堆栈信息,还可以发现,问题主要由ObjectMapper的这个属性:SerializationFeature.FAIL_ON_EMPTY_BEANS,引发的。

由此,我们可以自定义一个 Mapper 继承 ObjectMapper,将以上属性转成我们所需要的即可。

 

解决方案:

1 public class CustomMapper extends ObjectMapper {2 3     public CustomMapper() {4         this.setSerializationInclusion(JsonInclude.Include.NON_NULL);5         // 设置 SerializationFeature.FAIL_ON_EMPTY_BEANS 为 false6         this.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);7     }8 9 }
CustomMapper

 

1 
2
3
4
5
text/html;charset=UTF-8
6
application/x-www-form-urlencoded;charset=UTF-8
7
application/json;charset=UTF-8
8
9
10
11
12
13
14
15
webmvc-config.xml

 

Over,问题解决!

 

上一篇:设计模式(一)单例模式:概述
下一篇:项目记事【SpringMVC-1】:后台接收前端传来的JSON,并转成对象

发表评论

最新留言

很好
[***.229.124.182]2025年04月13日 20时56分26秒