【随手记录】实体类里方法自动执行问题
在写微服务时候遇到一个问题,提供者的实体类会自动执行其中的方法(即使这个方法没有调用)然后这个方法报错了!这就神奇了,明明没有调用为啥会执行?
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
即可.