XmlAdapter在JAXB RI中无法正常工作

Ser*_*gio 2 java xml jaxb

我正在尝试实现一个XmlAdapter来修改某些对象属性的编组/解组.特别是,我尝试了NullStringAdapter这里描述的:

Jaxb:xs:属性null值

该目标是将NullStringAdapter空值编组为空字符串,反之亦然.

与上面描述的示例和我的代码的唯一区别是,我想将适配器应用于元素,而不是属性,所以我拥有的是:

@XmlElement
@XmlJavaTypeAdapter(NullStringAdapter.class)
public String getSomeValue() {
    return someValue;  //someValue could be null, in that case the adapter should marshall it as an empty string
}
Run Code Online (Sandbox Code Playgroud)

但是,经过一些调试后,我意识到在从Java到XML的编组过程中从未调用过Adapter方法!当XmlElement值为null时,会发生这种情况.当此值不为null时,将按预期调用适配器方法.

谢谢你的帮助!.

bdo*_*han 5

注意: 我是EclipseLink JAXB(MOXy)的负责人,也是JAXB 2(JSR-222)专家组的成员.

但是,经过一些调试后,我意识到在从Java到XML的编组过程中从未调用过Adapter方法!当XmlElement值为null时,会发生这种情况.当此值不为null时,将按预期调用适配器方法.

此行为因JAXB的实现而异.XmlAdapter当字段/属性为null时,JAXB引用实现不会调用marshal方法,但MOXy将会.

JAXB规范说的内容(第5.5.1节简单属性)

get或is方法返回前一小节中指定的属性值.如果返回null,则认为该属性不在其表示的XML内容中.

对该陈述的MOXy解释是,字段/属性的值实际上是它经过的值XmlAdapter.这对于支持Sergio正在寻找行为是必要.

  • 这几乎是最有意义的.在我看来,`null`应该是一个像任何其他值一样的值,并且可以通过适配器解释. (3认同)