springboot接口参数注解继承问题

博客讨论了Spring框架从4.X升级到5.X后,接口参数注解处理方式的差异。在新版本中,接口的参数注解会生效,导致旧框架下依赖controller中参数注解的接口出现参数不匹配错误。问题源于Spring-web5.X内部方法的重写,该方法现在会合并接口和controller的参数注解。解决方案可能涉及调整接口或controller的参数注解以匹配新框架的行为。
摘要由CSDN通过智能技术生成

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中的参数注解为准进行拦截和参数转换。

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: MybatisPlus提供了丰富的注解支持,可以使您在SpringBoot中轻松实现代码查询。它们包括@Select、@Insert、@Update、@Delete、@SelectProvider等,可以满足您的不同需求。代码实现很简单:@Select("SELECT * FROM user WHERE id = #{id}") User findById(int id);@Insert("INSERT INTO user(name, age) VALUES(#{name}, #{age})") int insert(User user);@Update("UPDATE user SET name=#{name}, age=#{age} WHERE id=#{id}") int update(User user);@Delete("DELETE FROM user WHERE id=#{id}") int delete(int id); ### 回答2: 在Spring Boot项目中使用MyBatis Plus进行注解查询可以通过以下步骤实现: 1. 添加依赖:在项目的pom.xml文件中添加MyBatis Plus的依赖。可以通过以下方式添加依赖: ``` <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>最新版本号</version> </dependency> ``` 2. 配置数据源:在项目的application.properties或application.yml文件中配置数据源相关信息,包括数据库URL、用户名、密码等。 3. 创建实体类:创建与数据库表对应的实体类,并使用MyBatis Plus的注解进行字段映射。例如,使用`@TableName`注解指定实体类和数据库表的对应关系,使用`@TableId`注解指定主键。 4. 创建Mapper接口:创建一个Mapper接口继承MyBatis Plus提供的BaseMapper接口。不需要实现该接口中的方法,因为MyBatis Plus根据方法名自动生成SQL语句。 5. 注解查询:在业务逻辑的代码中,通过注入Mapper对象,调用其提供的方法进行查询。例如,使用`@Select`注解指定SQL语句,使用`@Param`注解指定参数。 以下是一个示例: ```java @Entity @TableName("user") public class User { @TableId private Long id; private String username; private String password; // 省略getter和setter方法 } @Mapper public interface UserMapper extends BaseMapper<User> { @Select("SELECT * FROM user WHERE username = #{username}") User findByUsername(@Param("username") String username); } @Service public class UserService { @Autowired private UserMapper userMapper; public User getUserByUsername(String username) { return userMapper.findByUsername(username); } } ``` 在上面的例子中,`User`是一个实体类,使用`@TableName`注解指定与数据库表`user`的对应关系。`UserMapper`接口继承了`BaseMapper`接口,其中`findByUsername`方法使用了`@Select`注解指定查询语句,并使用了`@Param`注解指定参数。`UserService`中注入了`UserMapper`对象,并调用其方法进行查询。 ### 回答3: 使用Spring Boot和MyBatis Plus进行注解查询的步骤如下: 1. 首先,在你的Spring Boot项目中添加依赖。在pom.xml文件中添加如下依赖: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>latest-version</version> </dependency> ``` 2. 创建数据库表和实体类。在你的数据库中创建表,并创建对应的实体类。 例如,创建一个User表,包含id、name和age字段,对应的User实体类如下: ```java @Data public class User { private Long id; private String name; private Integer age; } ``` 3. 创建Mapper接口。在你的项目中创建一个Mapper接口,并使用MyBatis Plus的注解来定义查询方法。 例如,创建一个UserMapper接口,在该接口中使用`@Select`注解进行查询: ```java @Mapper public interface UserMapper extends BaseMapper<User> { @Select("SELECT * FROM user WHERE age > #{age}") List<User> findUsersByAge(@Param("age") Integer age); } ``` 4. 使用Mapper进行查询。在你的服务类或Controller中使用自动注入的UserMapper实例进行查询。 例如,在UserController中调用查询方法: ```java @RestController @RequestMapping("/users") public class UserController { @Autowired private UserMapper userMapper; @GetMapping("/age/{age}") public List<User> getUsersByAge(@PathVariable Integer age) { return userMapper.findUsersByAge(age); } } ``` 现在,你可以通过发送GET请求`/users/age/18`来获取年龄大于18的用户列表。 以上就是使用Spring Boot和MyBatis Plus进行注解查询的简单示例。你可以根据具体的业务需求,使用不同的注解和SQL语句来查询和操作数据库。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值