【问题标题】:Apply filter on all annotated fields of a POJO (Java)对 POJO (Java) 的所有带注释字段应用过滤器
【发布时间】:2021-07-01 19:45:23
【问题描述】:

想象一下有这样一种 POJO 类,它们只保存数据:

public class Pojo() {

  @AnnotatedProp
  String someField;

  SubPojo someSubPojo;

  String someOtherFieldA;

  String someOtherFieldB;
}

public class SubPojo() {

  @AnnotatedProp
  String someSubField;

  Integer someOtherFieldC;
}

PojosomeFieldSubPojosomeSubField 使用@AnnotatedProp 属性标记为特殊。

我想修改Pojo 类型的对象。应修改所有带有@AnnotatedProp 注释的字符串字段。 “过滤器”应该修改这些字段的值,例如替换里面的一些字符。

我尝试使用 FieldUtils / 简单反射,但最终导致堆栈溢出(异常和这个论坛)。

过滤这些字段的最佳方法是什么?

感谢您的帮助。

【问题讨论】:

  • 你能展示你试过的代码吗?我假设你使用了FieldUtils.getFieldsListWithAnnotation,出了什么问题?

标签: java reflection javabeans pojo


【解决方案1】:

我为此编写了一个递归 POJO 过滤器/转换器,因为我在一个项目中需要它。只是清理并获得释放的绿灯,但关键点是:

  • 使用FieldUtils.readField(field, node, true) 进行遍历——为了让所有字段都用你的Annotation 进行注释,还有一个直接的方法FieldUtils.getFieldsListWithAnnotation() 但我需要一种更灵活的方法来首先扫描所有节点,这样我就可以深入了解子对象
  • 您需要检查您自己的基础包名称以识别您的自定义 POJO 类,并且只遍历那些子对象。
  • 一旦你有你的注释字段,你可以简单地使用FieldUtils.writeField(field, node, getMyValueForField(field), true);

注意事项:

  • 为了避免反向引用(子->祖先)的 StackOverflow,我保留了一个 HashMap 并存储了我遍历到的节点的 FQCN
  • 在自己动手之前,我检查了 Apache commons ObjectGraphIterator,但发现它不适合我的目的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-20
    • 2018-12-23
    • 2020-03-11
    • 2012-04-05
    • 2022-09-24
    • 2011-06-04
    • 1970-01-01
    • 2016-07-19
    相关资源
    最近更新 更多