背景
一个用于接收http request参数的JavaBean:SkuPrimeModifyDto,有些属性上validation的条件,使用hibernate作为校验实现类。
现在新增一个JavaBean:SkuPrimeModifyV2Dto,继承SkuPrimeModifyDto,并在SkuPrimeModifyV2Dto的属性中添加一个和SkuPrimeModifyDto一样的变量: barcode, 同时新增一个校验:@Pattern(regexp = “^([A-Z]|-|[0-9])+$”)
代码如下:
@Data
@SuppressWarnings({ "PMD.UnusedPrivateField", "PMD.SingularField" })
public class SkuRegisterDto {
@NotNull
@Size(min = 1, max = 255)
private String skuName;
...
@NotNull()
@Size(min = 1, max = 40)
private String barcode;
}
@Data
public class SkuPrimeModifyV2Dto extends SkuPrimeModifyDto{
@NotNull()
@Pattern(regexp = "^([A-Z]|-|[0-9])+$")
@Size(min = 1, max = 40)
private String barcode;
}
问题
测试时发现:
- 当
barcode
符合正则时会抛出Field error in object 'skuPrimeModifyV2Dto' on field 'barcode': rejected value [null]; codes [NotNull.skuPrimeModifyV2Dto.barcode,NotNull.barcode,NotNull.java.lang.String,NotNull]...
; - 当
barcode
不符合正则时会抛出Field error in object 'skuPrimeModifyV2Dto' on field 'barcode': rejected value [FSDE23cvsvsFF23@2131-]; codes [Pattern.skuPrimeModifyV2Dto.barcode,Pattern.barcode,Pattern.java.lang.String,Pattern]...
分析
第一反应:怀疑SkuPrimeModifyV2Dto
的barcode
初始化方法没有被调用,于是手动添加Getter和Setter方法;
结果还是一样的错误,单步调试发现:SkuPrimeModifyV2Dto
的barcode
设置成功,有值。
遂怀疑是父类的barcode
没有正确设值,因此重写SkuPrimeModifyV2Dto
的无参构造器,在其中调用super.setBarcode(this.barcode)
对父类的属性设值。
结果还是错误,恍然大悟,无参构造器在Setter方法前调用,this.barcode
此时还是空值。
解决
在SkuPrimeModifyV2Dto
中手写Setter方法
public void setBarcode(String barcode) {
super.setBarcode(barcode);
this.barcode = barcode;
}
总结
lombok的@Data
、@Setter
方法确实很方便,但是有时候也要因地制宜才行。