【随手记录】实体类里方法自动执行问题

在写微服务时候遇到一个问题,提供者的实体类会自动执行其中的方法(即使这个方法没有调用)然后这个方法报错了!这就神奇了,明明没有调用为啥会执行?

org.springframework.http.converter.HttpMessageNotWritableException: Could not write JSON: (was java.lang.NullPointerException); nested exception is com.fasterxml.jackson.databind.JsonMappingException: (was java.lang.NullPointerException) (through reference chain: 
at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.writeInternal(AbstractJackson2HttpMessageConverter.java:296),
at org.springframework.http.converter.AbstractGenericHttpMessageConverter.write(AbstractGenericHttpMessageConverter.java:103),
at org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodProcessor.writeWithMessageConverters(AbstractMessageConverterMethodProcessor.java:290),
at org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.handleReturnValue(RequestResponseBodyMethodProcessor.java:180),
at org.springframework.web.method.support.HandlerMethodReturnValueHandlerComposite.handleReturnValue(HandlerMethodReturnValueHandlerComposite.java:82),
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:119),
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:895),
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:800),
at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87),
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1038),
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:942),
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1005),
at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:908),
at javax.servlet.http.HttpServlet.service(HttpServlet.java:660),
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:882),
at javax.servlet.http.HttpServlet.service(HttpServlet.java:741),
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231),
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166),
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53),
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193),
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166),
at org.springframework.boot.actuate.web.trace.servlet.HttpTraceFilter.doFilterInternal(HttpTraceFilter.java:90),
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107),
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193),
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166),
at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:99),
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107),
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193),
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166),
at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:92),
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107),
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193),
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166),
at org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:93),
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107),
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193),
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166),
at org.springframework.boot.actuate.metrics.web.servlet.WebMvcMetricsFilter.filterAndRecordMetrics(WebMvcMetricsFilter.java:117),
at org.springframework.boot.actuate.metrics.web.servlet.WebMvcMetricsFilter.doFilterInternal(WebMvcMetricsFilter.java:106),
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107),
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193),
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166),
at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:200),
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107),
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193),
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166),
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:200),
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96),
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:490),
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139),
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92),
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74),
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343),
at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:408),
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66),
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:834),
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1415),
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49),
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source),
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source),
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61),
at java.lang.Thread.run(Unknown Source),
Caused by: com.fasterxml.jackson.databind.JsonMappingException: (was java.lang.NullPointerException) (through reference chain: 
at com.fasterxml.jackson.databind.JsonMappingException.wrapWithPath(JsonMappingException.java:394),
at com.fasterxml.jackson.databind.JsonMappingException.wrapWithPath(JsonMappingException.java:353),
at com.fasterxml.jackson.databind.ser.std.StdSerializer.wrapAndThrow(StdSerializer.java:316),
at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:727),
at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:155),
at com.fasterxml.jackson.databind.ser.std.CollectionSerializer.serializeContents(CollectionSerializer.java:145),
at com.fasterxml.jackson.databind.ser.std.CollectionSerializer.serialize(CollectionSerializer.java:107),
at com.fasterxml.jackson.databind.ser.std.CollectionSerializer.serialize(CollectionSerializer.java:25),
at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:727),
at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:719),
at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:155),
at com.fasterxml.jackson.databind.ser.DefaultSerializerProvider._serialize(DefaultSerializerProvider.java:480),
at com.fasterxml.jackson.databind.ser.DefaultSerializerProvider.serializeValue(DefaultSerializerProvider.java:319),
at com.fasterxml.jackson.databind.ObjectWriter$Prefetch.serialize(ObjectWriter.java:1396),
at com.fasterxml.jackson.databind.ObjectWriter.writeValue(ObjectWriter.java:913),
at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.writeInternal(AbstractJackson2HttpMessageConverter.java:287),
... 61 more,
Caused by: java.lang.NullPointerException,
at sun.reflect.GeneratedMethodAccessor216.invoke(Unknown Source),
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source),
at java.lang.reflect.Method.invoke(Unknown Source),
at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:688),
at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:719),
... 73 more, 

查了下资料,在我们使用的jackson里,对于实体类,内部所有以getXx命名开始的方法,在json序列化的过程中,所有的getter方法会被看作是一个获取成员属性值的方法而被自动执行,即使没有这个成员属性,以此获取到的返回值作为value,getXx 去掉get获取属性Xx作为key

为了避免这种情况,实体类里如果不是成员属性的封装特性(getter setter),最好不要以getXx命名开头或者在jackson中,提供了相应的annotation,可以把这类方法忽略掉。在方法前加上@JsonIgnore 即可.

posted @ 2020-04-14 07:13  空知大仙人  阅读(687)  评论(0编辑  收藏  举报