JAXB元帅空字符串全局为空

JAXB元帅空字符串全局为空,第1张

JAXB元帅空字符串全局为空

注意: 我是 Eclipselink
JAXB(MOXy)的
负责人,并且是
JAXB(JSR-222)
专家组的成员。

您所做的正确,您看到的错误是由于我认为是 JAXB参考实现中 的错误所致。JAXB
RI应该能够处理从中返回的空值

XmlAdapter
。该用例适用于Eclipselink JAXB(MOXy),下面将通过示例进行演示。

字符串适配器

下面是一个实现,它近似于从XML模式生成Java模型后所得到的实现(请参阅http://blog.bdoughan.com/2011/08/xml-
schema-to-java-generating。 html)。

package forum11894193;import javax.xml.bind.annotation.adapters.XmlAdapter;public class StringAdapter extends XmlAdapter<String, String> {    @Override    public String marshal(String string) throws Exception {        if("".equals(string)) { return null;        }        return string;    }    @Override    public String unmarshal(String string) throws Exception {        return string;    }}

包装信息

由于您正在注册全局适配器,因此将从

package-info
类似以下类的类中进行引用(请参阅:http : //blog.bdoughan.com/2012/02/jaxb-and-
package-level-xmladapters.html)。

@XmlJavaTypeAdapters({    @XmlJavaTypeAdapter(value=StringAdapter.class, type=String.class)})package forum11894193;import javax.xml.bind.annotation.adapters.*;

下面是带有几个

String
字段的示例域类。由于
XmlAdapter
已在包级别注册,因此它将应用于该包中的所有映射的String字段/属性。

package forum11894193;import javax.xml.bind.annotation.*;@XmlRootElement@XmlAccessorType(XmlAccessType.FIELD)public class Root {    String a;    String b;    String c;}

演示版

在下面的演示代码中,我们将创建一个实例,

Root
将几个字段设置为
""
,然后将其编组为XML。

package forum11894193;import javax.xml.bind.*;public class Demo {    public static void main(String[] args) throws Exception {        JAXBContext jc = JAXBContext.newInstance(Root.class);        Root root = new Root();        root.a = "";        root.b = "b";        root.c = "";        Marshaller marshaller = jc.createMarshaller();        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);        marshaller.marshal(root, System.out);    }}

使用JAXB RI输出

在此示例中使用JAXB RI会产生NPE。堆栈跟踪是不同的,但是我们最有可能使用不同的封送方法。我还使用了JDK中包含的JAXB
RI版本,该版本已重新打包为

com.sun.xml.internal.bind.v2

Exception in thread "main" java.lang.NullPointerException    at com.sun.xml.internal.bind.v2.runtime.output.Enpred.setEscape(Enpred.java:96)    at com.sun.xml.internal.bind.v2.runtime.output.UTF8XmlOutput.doText(UTF8XmlOutput.java:294)    at com.sun.xml.internal.bind.v2.runtime.output.UTF8XmlOutput.text(UTF8XmlOutput.java:283)    at com.sun.xml.internal.bind.v2.runtime.output.IndentingUTF8XmlOutput.text(IndentingUTF8XmlOutput.java:141)    at com.sun.xml.internal.bind.v2.runtime.XMLSerializer.leafElement(XMLSerializer.java:293)    at com.sun.xml.internal.bind.v2.model.impl.RuntimeBuiltinLeafInfoImpl.writeLeafElement(RuntimeBuiltinLeafInfoImpl.java:179)    at com.sun.xml.internal.bind.v2.model.impl.RuntimeBuiltinLeafInfoImpl.writeLeafElement(RuntimeBuiltinLeafInfoImpl.java:166)    at com.sun.xml.internal.bind.v2.runtime.reflect.TransducedAccessor$CompositeTransducedAccessorImpl.writeLeafElement(TransducedAccessor.java:239)    at com.sun.xml.internal.bind.v2.runtime.property.SingleElementLeafProperty.serializeBody(SingleElementLeafProperty.java:87)    at com.sun.xml.internal.bind.v2.runtime.ClassBeanInfoImpl.serializeBody(ClassBeanInfoImpl.java:306)    at com.sun.xml.internal.bind.v2.runtime.XMLSerializer.childAsSoleContent(XMLSerializer.java:561)    at com.sun.xml.internal.bind.v2.runtime.ClassBeanInfoImpl.serializeRoot(ClassBeanInfoImpl.java:290)    at com.sun.xml.internal.bind.v2.runtime.XMLSerializer.childAsRoot(XMLSerializer.java:462)    at com.sun.xml.internal.bind.v2.runtime.MarshallerImpl.write(MarshallerImpl.java:314)    at com.sun.xml.internal.bind.v2.runtime.MarshallerImpl.marshal(MarshallerImpl.java:243)    at javax.xml.bind.helpers.AbstractMarshallerImpl.marshal(AbstractMarshallerImpl.java:75)    at forum11894193.Demo.main(Demo.java:17)

使用Eclipselink JAXB(MOXy)输出

当MOXy用作JAXB提供程序时,您将获得所需的输出。有关将MOXy指定为JAXB提供程序的信息,请参见:http ://blog.bdoughan.com/2011/05/specifying-
eclipselink-moxy-as-your.html 。

<?xml version="1.0" encoding="UTF-8"?><root>   <b>b</b></root>


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5462174.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-12
下一篇 2022-12-12

发表评论

登录后才能评论

评论列表(0条)

保存