背景
一個用於接收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
方法確實很方便,但是有時候也要因地制宜才行。