栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

Jaxb以自定义注释编组

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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;    }}


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/507981.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号