注意: 我是 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>
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)