使用Instancio忽略所有类的父类私有属性时遇字段无效错误怎么办?
问题
现有抽象类A,包含私有成员_dtoType和uuid:
_dtoType在构造方法中初始化为当前类的简单名称uuid默认通过UUID.randomUUID().toString()生成
类B、C、D均继承自A,其中类B包含accountNumber、name等私有成员。
尝试用Instancio创建B类实例时,希望忽略所有类的_dtoType和uuid属性,编写的代码如下:
B item = Instancio.of(B.class) .generate(field(B::getAccountNumber), gen -> gen.text().pattern("#d#d#d#d#d#d#d#d")) .ignore(all(field("_dtoType"))) .ignore(all(field("uuid"))) .subtype(all(C.class), C.class) .subtype(all(D.class), D.class) .create();
运行时报错:
Reason: invalid field '_dtoType' for class B
需要解决如何正确忽略所有类的父类私有属性的问题。
解决方法
报错核心原因是_dtoType和uuid是父类A的私有字段,直接通过子类B的上下文指定字段名时,Instancio无法在子类中定位到这些父类私有字段。正确的处理方式是通过父类A来指定要忽略的字段,结合all()方法覆盖所有子类场景:
- 明确基于父类A定位字段,而非子类B
- 使用
field(A.class, "_dtoType")和field(A.class, "uuid")精准定位父类私有字段
修正后的代码如下:
B item = Instancio.of(B.class) .generate(field(B::getAccountNumber), gen -> gen.text().pattern("#d#d#d#d#d#d#d#d")) .ignore(all(field(A.class, "_dtoType"))) .ignore(all(field(A.class, "uuid"))) .subtype(all(C.class), C.class) .subtype(all(D.class), D.class) .create();
如果父类A为这两个字段提供了getter方法(比如getDtoType()和getUuid()),还可以通过方法引用的方式指定,避免硬编码字段名,写法更安全:
// 基于父类的getter方法引用忽略字段 .ignore(all(field(A::getDtoType))) .ignore(all(field(A::getUuid)))
以上两种写法都能正确忽略所有继承自A的子类中的这两个父类私有属性,不会再出现字段不存在的错误。
内容的提问来源于stack exchange,提问作者John Manko
相关产品推荐
相关产品推荐

