Spring调用@RestController接口报UUID构造器参数名无法解析错误
报错原因
- Java 注解的继承规则中,方法参数上的注解默认不会被子类重写方法的对应参数继承,你在
ComputationCallback接口startTask方法参数上标注的@RequestParam(value = "taskId"),不会被实现类ComputationCallbackController的重写方法识别。 - 当方法参数没有显式标注
@RequestParam时,Spring MVC 会将其判定为模型属性,尝试通过反射调用UUID的构造函数实例化对象,而UUID(long,long)构造函数的参数名在编译后默认没有保留,因此触发找不到参数名的报错。
解决方案
推荐优先使用以下最稳定的方案:
在实现类的方法参数上补充@RequestParam注解,明确指定参数绑定来源:
@RestController public class ComputationCallbackController implements ComputationCallback { @Override public boolean startTask(@RequestParam(value = "taskId") UUID taskId) { // 原有业务逻辑 } }
补充注解后,Spring 会自动从请求的查询参数中读取taskId的字符串值,通过内置的类型转换器直接转为UUID对象,不会再走模型属性的实例化逻辑,报错即可解决。
如果需要把参数注解统一写在接口侧,也可以搭配以下配置生效:
在项目的编译插件中添加-parameters编译参数,保留方法参数名信息,以Maven为例:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.1</version> <configuration> <compilerArgs> <arg>-parameters</arg> </compilerArgs> </configuration> </plugin>
内容的提问来源于stack exchange,提问作者Christian
相关产品推荐
相关产品推荐

