问题描述
项目使用了滑块验证,登录接口需要前端传用户滑动的横向位移,定义成“xMoved”,但是测试时,这个字段总是接不到值
原因分析:
@Data
public class LoginRequestDto {
@NotBlank(message = "账号不能为空")
private String username;
@NotBlank(message = "密码不能为空")
private String password;
@NotBlank(message = "校验ID不能为空")
private String verifyId;
@Min(value = 0, message = "移动像素不能小于0")
@Max(value = 500, message = "移动像素不能大于500")
private int xMoved;
@NotBlank(message = "应用编码不能为空")
private String systemCode;
private boolean remember = Boolean.FALSE;
}
尝试将xMoved的类型改成包装类型Integer,去掉校验,都不行。
最后试着将“xMoved”改成“moved”,立马就好使了
怀疑是未编译好,重新换成“xMoved”,查看编译的class。
public class LoginRequestDto {
private @NotBlank(
message = "账号不能为空"
) String username;
private @NotBlank(
message = "密码不能为空"
) String password;
private @NotBlank(
message = "校验ID不能为空"
) String verifyId;
private @Min(
value = 0L,
message = "移动像素不能小于0"
) @Max(
value = 500L,
message = "移动像素不能大于500"
) int xMoved;
private @NotBlank(
message = "应用编码不能为空"
) String systemCode;
private boolean remember;
public LoginRequestDto() {
this.remember = Boolean.FALSE;
}
...
public int getXMoved() {
return this.xMoved;
}
...
public void setXMoved(int xMoved) {
this.xMoved = xMoved;
}
...
感觉set没啥问题,首字母大写了,setXMoved()
但是还是不行≡(▔﹏▔)≡
解决方案:
最终是将“xMoved”改成了“moved”,处理的。
后发现此博客JavaBean getter/setter命名规范[特例],终于知道了原因
1、如果属性名的第二个字母大写,那么该属性名直接用作 getter/setter 方法中 get/set 的后部分,就是说大小写不变。例如属性名为uName,方法是getuName/setuName。
2、如果属性名的前两个字母是大写(一般的专有名词和缩略词都会大写),也是属性名直接用作 getter/setter 方法中 get/set 的后部分。例如属性名为URL,方法是getURL/setURL。
3、如果属性名的首字母大写,也是属性名直接用作 getter/setter 方法中 get/set 的后部分。例如属性名为Name,方法是getName/setName,这种是最糟糕的情况,会找不到属性出错,因为默认的属性名是name。
4、如果属性名以"is"开头,则getter方法会省掉get,set方法会去掉is。例如属性名为isOK,方法是isOK/setOK。
这是JavaBean的getter/setter特例。而lombok未处理第二个字母大写的场景,依旧按照普通字段生成set方法,导致出现这个问题。
使用idea自带的生成set方法,确实验证了此问题,“xMoved”生成的是setxMoved