本文主要是介绍springboot3 controller中的参数 本地开发可以正常注入,但是打包到生产后就无法识别,必须使用@RequestParam后才可以识别问题解决,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
问题
在Controller代码中声明了一个参数,本地可以正常注入:
@RestController
public class TestController {@GetMapping("test")public String test(String testParam) {return "test" + testParam;}
}
在本地 访问 GET http://localhost:8080/test?testParam=xxx
可以正常获取到参数xxx,但是打包到生产后,参数就获取不到了。
原因
本地开发时,java编译后的class还是带着参数信息的,和我们写的一样,但是,生产编译后,javac默认是不带参数信息的,就变成类似如下代码:
@RestController
public class TestController {@GetMapping("test")public String test(String var1) {return "test" + var1;}
}
由于名字被改成简化版的值,所以无法注入了。
解决方案
- 使用@RequestParam
@RestController
public class TestController {@GetMapping("test")public String test(@RequestParam("testParam") String testParam) {return "test" + testParam;}
}
- 上面的方法比较麻烦,也可以在编译时保留参数信息,设置编译参数:
<plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>${maven-compiler-plugin.version}</version><configuration><compilerArgument>-parameters</compilerArgument></configuration></plugin>
延伸
由于编译后参数信息丢失导致的类似注入失败,参数解析失败等问题还有很多,比如:
spring 同一个类型多个bean 本地运行正常 打包后生产无法运行 提示 无法找到匹配的bean(expected single matching bean but found 2))
在IDEA和maven中添加编译参数-parameters。解决Name for argument of type xxx not specified…问题
等
这篇关于springboot3 controller中的参数 本地开发可以正常注入,但是打包到生产后就无法识别,必须使用@RequestParam后才可以识别问题解决的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!