API中的接口
controller中实现的接口方法
问题:新框架部署后,原来旧框架能访问成功的接口报参数不匹配错误。
现象:旧框架中,无法继承参数的注解,会以controller中定义的参数名为准。
新框架中,API接口的参数注解继承生效,如果子类没有重写的话,会以接口中的参数注解为准。
spring-web 5.X 部分堆栈信息如下:
java.lang.Exception: 打印堆栈信息
at org.springframework.core.MethodParameter.getParameterAnnotations(MethodParameter.java:635) ~[spring-core-5.3.7.jar:5.3.7]
at org.springframework.web.method.HandlerMethod$HandlerMethodParameter.getParameterAnnotations(HandlerMethod.java:502) ~[spring-web-5.3.7.jar:5.3.7]
at org.springframework.core.MethodParameter.getParameterAnnotation(MethodParameter.java:668) ~[spring-core-5.3.7.jar:5.3.7]
at org.springframework.core.MethodParameter.hasParameterAnnotation(MethodParameter.java:683) ~[spring-core-5.3.7.jar:5.3.7]
at org.springframework.web.method.annotation.ModelFactory.findSessionAttributeArguments(ModelFactory.java:182) ~[spring-web-5.3.7.jar:5.3.7]
at org.springframework.web.method.annotation.ModelFactory.initModel(ModelFactory.java:114) ~[spring-web-5.3.7.jar:5.3.7]
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:871) ~[spring-webmvc-5.3.7.jar:5.3.7]
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808) ~[spring-webmvc-5.3.7.jar:5.3.7]
at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) ~[spring-webmvc-5.3.7.jar:5.3.7]
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1063) ~[spring-webmvc-5.3.7.jar:5.3.7]
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:963) ~[spring-webmvc-5.3.7.jar:5.3.7]
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) ~[spring-webmvc-5.3.7.jar:5.3.7]
at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898) ~[spring-webmvc-5.3.7.jar:5.3.7]
at javax.servlet.http.HttpServlet.service(HttpServlet.java:645) ~[javax.servlet-api-4.0.1.jar:4.0.1]
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) ~[spring-webmvc-5.3.7.jar:5.3.7]
at javax.servlet.http.HttpServlet.service(HttpServlet.java:750) ~[javax.servlet-api-4.0.1.jar:4.0.1]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:227) ~[tomcat-embed-core-9.0.46.jar:9.0.46]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) ~[tomcat-embed-core-9.0.46.jar:9.0.46]
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) ~[tomcat-embed-websocket-9.0.46.jar:9.0.46]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) ~[tomcat-embed-core-9.0.46.jar:9.0.46]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) ~[tomcat-embed-core-9.0.46.jar:9.0.46]
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:327) ~[spring-security-web-5.4.6.jar:5.4.6]
原因分析:
在spring-web 5.X中重写了内部类的方法,用于获取接口中的参数注解,并进行合并,controller类中实现API接口时,默认获取接口中的参数注解,并按注解中的配置进行拦截和参数转换。
spring-web 4.X版本中没有重写此方法,以controller中的参数注解为准进行拦截和参数转换。