Spring 中首字母小写,第二个字母大写造成的参数问题
在进行前后端的联调时,有时候会出现,前端明明传了值,后端接口却接收不到的情况,这种情况常常让人很苦恼。已排除以下情况:
都没发现什么问题。
@PostMapping(value = "/test")
public void test(@RequestBody UserVO userVO) {
System.out.println("用户代码:" + userVO.getUCode());
System.out.println("用户名称:" + userVO.getUName());
}
UserVO
@Data
public class UserVO {
/**
* 用户代码
*/
private Long uCode;
/**
* 用户名称
*/
private String uName;
}
用户代码:null
用户名称:null
com.fasterxml.jackson.databind.util.BeanUtil
类中的legacyManglePropertyName
方法中
方法解析:
所以:
然后根据得到的属性名去找get/set方法,想要找到setUname/setUcode的方法没找到。
没找到原因是:
然后我们这里的VO对象使用的是@Data注解生成的get/set方法,生成的方法参考:
可以看到lombok插件这边生成的get/set方法名为
两个框架得到的不一样。导致了以上问题。
@JsonProperty
字段第一个字母小写第二个字母大写的属性,另一个解决办法就是把private改为public
@Data
public class UserVO {
/**
* 用户代码
*/
public Long uCode;
/**
* 用户名称
*/
public String uName;
}
原理:
在Jackson获取对象字段时候会调用 com.fasterxml.jackson.databind.introspectPOJOPropertiesCollector.collectAll()
方法
上图部分会删除私有属性,也就是private
标记的属性,所以这里改为public
能解决。
直接改表字段名吧
避免单字母+单词驼峰设计,例如:
改为:
或者其他
自然情况下(未加处理):对象里面的字段设计为uName
样式,传递参数需要以uname
方式传递,且返回对象的属性名也是uname
,非Java对象里面的uName
https://blog.xqlee.com/article/2504111709123599.html