在开发业务中有一个请求接受实体大致如下:
@Data
public class ActivityAddQuery {
/**
* a类标签
*/
@NotBlank(message="a类标签不能为空")
@Length(max=64,message = "")
private String aLabel;
}
在前端请求参数设置为{“aLabel”:“aaa”}时后端接受到的参数一直为空,查询资料发现,spring的jackson参数发现顺序,依次如下:
1.所有被public修饰的字段;
2.所有被public修饰的getter;
3.所有被public修饰的setter。
由于aLabel被设置成private,不符合第1条,到了第二条得到的是getALabel()方法,jackson不知道第一个A是大写还是小写,默认将从第一个大写开始的所有大写字母识别成小写,即alabel,读取setALabel()也一样。例如属性aLLbel也会由getALLabel()识别成allbel。
解决方案: 添加@JsonProperty(“aLabel”)指定json名称即可。
@Data
public class ActivityAddQuery {
/**
* a类标签
*/
@JsonProperty("aLabel")
private String aLabel;
}
想要知道原因,首先查看编译之后的的class为
@Data
public class ActivityAddQuery {
/**
* a类标签
*/
@JsonProperty("aLabel")
private String aLabel;
public String getALabel() {
return this.aLabel;
}
@JsonProperty

本文记录了在使用Jackson进行参数请求时遇到的大写属性取值异常和序列化出现多余属性的问题。问题源于Jackson识别字段和方法时的规则,解决方案是使用@JsonProperty指定JSON名称。在序列化过程中,由于属性和getter/setter的识别规则,可能导致属性重复。IDE如IDEA在生成get/set方法时,会避免此类问题,但手动编写时需要注意首字母大小写的规范,以防止序列化歧义。
最低0.47元/天 解锁文章
1464

被折叠的 条评论
为什么被折叠?



