浅析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方法确实很方便,但是有时候也要因地制宜才行。

你可能感兴趣的:(JAVA相关笔记,踩坑记录)