查询参数触发org.springframework.beans.NotWritablePropertyException求助
我之前也踩过这个坑!这个异常说白了就是Spring没法找到请求参数对应的可写属性,大概率是你的Controller或者绑定的Bean出了问题,下面是我总结的几个排查方向:
检查目标类的Setter方法是否存在
Spring是严格遵循JavaBean规范来做属性绑定的,比如你的请求参数是param1,对应的Bean(或者Controller方法绑定的模型类)里必须有public void setParam1(String param1)这样的Setter方法。注意大小写要对应——如果属性名是param1,Setter的方法名必须是setParam1(首字母大写),不能写错成setparam1或者setParam。确认参数名与属性名完全匹配
看看URL里的参数名param1、param2,和你要绑定的类里的属性名是不是完全一致?比如有没有把类里的属性写成paramOne或者pParam1,导致Spring找不到对应的属性?正确使用@RequestParam注解
如果你的Controller方法是直接接收参数,而不是绑定到某个Bean,一定要加上@RequestParam注解。比如:@RequestMapping("/xx/xx.do") public String handleRequest(@RequestParam("param1") String param1, @RequestParam("param2") String param2) { // 业务逻辑 return "yourView"; }要是没加这个注解,Spring会默认尝试把参数绑定到模型属性,这时候就需要对应的模型类有Setter方法,反而容易出问题。
排查FormBean的绑定问题
如果你是把参数绑定到自定义的FormBean,要确保:- FormBean里有
param1和param2的私有属性,并且配套了正确的Setter方法; - Controller方法里用
@ModelAttribute注解声明了这个FormBean,比如:@RequestMapping("/xx/xx.do") public String handleRequest(@ModelAttribute YourFormBean formBean) { String param1 = formBean.getParam1(); // 处理逻辑 return "yourView"; }
- FormBean里有
检查参数类型兼容性
虽然这个异常主要是属性不可写,但如果参数类型不匹配(比如你传的是字符串,但属性是Integer类型),有时候也会间接触发类似问题。确保请求参数的类型和Bean属性的类型兼容,比如字符串对应String,数字对应Integer/Long等。
先从这几个方向排查,尤其是Setter方法和参数名匹配这两点,大部分情况下都能解决问题!
内容的提问来源于stack exchange,提问作者Prasad Bolla

