当前位置: 首页 > 面试题库 >

Jaxb以自定义注释编组

陶山
2023-03-14
问题内容

我有一个要求,根据字段上标记的自定义注释来编组/解组java pojo的某些元素。假设我的Java pojp中有3个字段

@CustomVersion("v1")
private String field1;
@CustomVersion("v1","v2")
private String field2;
@CustomVersion("v2")
private String field3;

如果我在jaxb中进行转换时传递version =“ v1”参数,我只想编组具有v1的字段。如果我通过v2,则所有带v2注释的字段都应编组。

甚至可以使用jaxb吗?我确信选择性的编组将通过某种图书馆或某种方式得到支持,经过大量的搜索后仍无法弄清楚。任何帮助或建议或指示都将受到高度赞赏。


问题答案:

首先,我建议在编组之前进行这样的预处理。这样会容易得多。但是,如果由于某些原因无法实现,则可以创建自定义类型适配器。然后,您可以放入@XmlJavaTypeAdapter(VersioningAdapter.class)要启用版本控制的每种类型。
@XmlJavaTypeAdapter也可以在程序包级别指定它,但是必须指定它适用于哪种类型。如果XmlAdapter不指定某处,就无法使用@XmlJavaTypeAdapter

这种解决方案的缺点:

  • 如果您有多个版本化类型,则每个类型都必须加上注释 @XmlJavaTypeAdapter
  • @XmlJavaTypeAdapter不适用于根元素,仅适用于子元素。编组之前,必须在根元素上手动调用适配器

AFAIK没有其他选项可以自定义JAXB编组。这就是为什么我认为注释处理应在编组之前在单独的步骤中执行。除非您接受上述限制。

样本适配器(可在此处找到完整的代码):

public class VersioningAdapter extends XmlAdapter<Object, Object> {

    @Override
    public Object unmarshal(Object v) throws Exception {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public Object marshal(Object v) throws Exception {
        if (v == null) {
            return v;
        }
        Field[] fields = v.getClass().getDeclaredFields();
        for (Field field : fields) {
            Annotation[] annotations = field.getDeclaredAnnotations();
            CustomVersion annotation = findCustomVersion(annotations);
            if (annotation != null) {
                if (!contains(annotation, Configuration.getVersion())) {
                    field.setAccessible(true);
                    field.set(v, null);
                }
            }
        }
        return v;
    }

    private CustomVersion findCustomVersion(Annotation[] annotations) {
        for (Annotation annotation : annotations) {
            if (annotation instanceof CustomVersion) {
                return (CustomVersion) annotation;
            }
        }
        return null;
    }

    private boolean contains(CustomVersion annotation, String version) {
        String[] values = annotation.value();
        for (String value : values) {
            if (value.equals(version)) {
                return true;
            }
        }
        return false;
    }

}


 类似资料:
  • 考虑到JAXB注释的对象,是否有办法确定类/字段/方法在封送过程中是否会导致xsi: type? 是XmlElement注释, 我唯一需要担心的情况? 我正在编写一个Lua解组器,在这里我们删除了很多常见的xml类型信息,我正在尝试找出如何将传入的Lua与JAXB匹配。 谢谢 --更新-- 下面是一个简单的示例,说明了问题: 当我收到一个动物对象时,我可以查询动物的注释来检测它应该是狗或猫而不是动

  • 问题内容: 注释如何与Java一起使用?以及如何创建这样的自定义注释: 基本上,我需要保留的POJO在持久化时像这样进行序列化: 这样,实际的生成/持久对象是这样的: 任何想法如何实现这一点? 问题答案: 如果创建自定义注释,则必须使用此处的 API 示例进行处理。您可以参考如何声明注释。 这是Java中的示例注释声明的样子。 并被称为。 表示您想在运行时保留注释,并且可以在运行时访问它。 表示您

  • 我想编写自定义Lombok注释处理程序。我知道http://notatube.blogspot.de/2010/12/project-lombok-creating-custom.html.但是当前的lombok jar文件并不包含很多内容。类文件,但文件名为。症状自评量表。取而代之的是龙目山。 我发现,的。SCL. lombok文件是. class文件,Lombok的构建脚本在生成jar文件时重

  • 问题内容: 我为我写了一个 对于每个我使用以下注释 因此,我决定定义自己的注释女巫,其中包含所有这样的注释 然后,我只用了一个注释 修改后,测试失败 为了使其再次工作,需要我将其添加到 我的问题是为什么我的注释包含注释时不起作用?注释有什么特别之处吗?还是我错过了什么? PS:我使用相同的方法,它们也很好用。 问题答案: 这种机制是Spring框架特有的,在这种机制中,您可以使用本身带有其他注释的

  • 使用 Vim 编辑 Shell 脚本,在进行调试时,需要进行多行的注释,每次都要先切换到输入模式,在行首输入注释符"#"再退回命令模式,非常麻烦。 连续行的注释其实可以用替换命令来完成。换句话说,在指定范围行加"#"注释,可以使用 ":起始行,终止行 s/^/#/g",例如: :1,10s/^/#/g 表示在第 1~10 行行首加"#"注释。"^"意为行首;"g"表示执行替换时不询问确认。如果希望

  • > 我不能使基本包属性是动态的,即我不能传递,但需要在配置中预先定义包。 我查看了,但无法使其工作。 当我忽略基本包时,扫描从注释的定义包开始,而不是从注释类的包开始。在上面的示例中,它只扫描并创建中类的bean,而不扫描并创建中的bean。 如果将放在类上,则一切都可以工作,但当将其移动到的元注释时,将停止工作。如何告诉Spring Framework将视为使用某些默认值指定的另一种方式。我尝试