淺析JavaBean繼承後重寫父類屬性和lombok註解帶來的問題和解決方案

背景

一個用於接收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;
}

問題

測試時發現:

  1. barcode符合正則時會拋出Field error in object 'skuPrimeModifyV2Dto' on field 'barcode': rejected value [null]; codes [NotNull.skuPrimeModifyV2Dto.barcode,NotNull.barcode,NotNull.java.lang.String,NotNull]...;
  2. barcode不符合正則時會拋出Field error in object 'skuPrimeModifyV2Dto' on field 'barcode': rejected value [FSDE23cvsvsFF23@2131-]; codes [Pattern.skuPrimeModifyV2Dto.barcode,Pattern.barcode,Pattern.java.lang.String,Pattern]...

分析

第一反應:懷疑SkuPrimeModifyV2Dtobarcode初始化方法沒有被調用,於是手動添加Getter和Setter方法;
結果還是一樣的錯誤,單步調試發現:SkuPrimeModifyV2Dtobarcode設置成功,有值。

遂懷疑是父類的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方法確實很方便,但是有時候也要因地制宜才行。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章