首先,我建议在编组之前进行这样的预处理。这样会容易得多。但是,如果由于某些原因无法实现,则可以创建自定义类型适配器。然后,您可以放入
@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; }}


