string - 当字符串为空但不为空时,如何防止在 JAXB 中编码空标签

标签 string tags jaxb marshalling

我试图让 JAXB 在字符串为空时不编码空标签。
我可以通过创建将返回 insted 空字符串 null 的 XmlAdapter 来实现。但这样一来,我将不得不用这个适配器注释每个属性。

有没有办法让它更全局化?

最佳答案

EclipseLink JAXB (MOXy) 将允许您指定 XmlAdapter对于 java.lang.String在包装级别(我是 MOXy 技术负责人):

包裹信息

@XmlJavaTypeAdapter(value=StringAdapter.class, type=String.class)
package example;

import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;

字符串适配器
package example;

import javax.xml.bind.annotation.adapters.XmlAdapter;

public class StringAdapter extends XmlAdapter<String, String> {

    @Override
    public String unmarshal(String v) throws Exception {
        return v;
    }

    @Override
    public String marshal(String v) throws Exception {
        if("".equals(v)) {
            return null;
        }
        return v;
    }

}


package example;

import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement
public class Root {

    private String foo;
    private String bar;

    public String getFoo() {
        return foo;
    }

    public void setFoo(String foo) {
        this.foo = foo;
    }

    public String getBar() {
        return bar;
    }

    public void setBar(String bar) {
        this.bar = bar;
    }

}

jaxb.properties

要使用 MOXy 作为您的 JAXB 提供程序,您需要包含一个名为 jaxb.properties 的文件。在与您的模型类相同的包中,具有以下条目:
javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory

演示
package example;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.Marshaller;

public class Demo {

    public static void main(String[] args) throws Exception {
        JAXBContext jc = JAXBContext.newInstance(Root.class);
        System.out.println(jc);

        Root root = new Root();
        root.setFoo("");
        root.setBar("");

        Marshaller marshaller = jc.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        marshaller.marshal(root, System.out);
    }

}

备注

由于我觉得是 JAXB 引用实现中的一个错误,如果您使用 Java SE 6 中包含的 JAXB 版本,则会引发以下异常:
Exception in thread "main" java.lang.NullPointerException
    at com.sun.xml.bind.v2.runtime.output.Encoded.setEscape(Encoded.java:107)
    at com.sun.xml.bind.v2.runtime.output.UTF8XmlOutput.doText(UTF8XmlOutput.java:315)
    at com.sun.xml.bind.v2.runtime.output.UTF8XmlOutput.text(UTF8XmlOutput.java:299)
    at com.sun.xml.bind.v2.runtime.output.IndentingUTF8XmlOutput.text(IndentingUTF8XmlOutput.java:153)
    at com.sun.xml.bind.v2.runtime.XMLSerializer.leafElement(XMLSerializer.java:325)
    at com.sun.xml.bind.v2.model.impl.RuntimeBuiltinLeafInfoImpl$1.writeLeafElement(RuntimeBuiltinLeafInfoImpl.java:210)
    at com.sun.xml.bind.v2.model.impl.RuntimeBuiltinLeafInfoImpl$1.writeLeafElement(RuntimeBuiltinLeafInfoImpl.java:209)
    at com.sun.xml.bind.v2.runtime.reflect.TransducedAccessor$CompositeTransducedAccessorImpl.writeLeafElement(TransducedAccessor.java:250)
    at com.sun.xml.bind.v2.runtime.property.SingleElementLeafProperty.serializeBody(SingleElementLeafProperty.java:98)
    at com.sun.xml.bind.v2.runtime.ClassBeanInfoImpl.serializeBody(ClassBeanInfoImpl.java:340)
    at com.sun.xml.bind.v2.runtime.XMLSerializer.childAsSoleContent(XMLSerializer.java:593)
    at com.sun.xml.bind.v2.runtime.ClassBeanInfoImpl.serializeRoot(ClassBeanInfoImpl.java:324)
    at com.sun.xml.bind.v2.runtime.XMLSerializer.childAsRoot(XMLSerializer.java:494)
    at com.sun.xml.bind.v2.runtime.MarshallerImpl.write(MarshallerImpl.java:315)
    at com.sun.xml.bind.v2.runtime.MarshallerImpl.marshal(MarshallerImpl.java:244)
    at javax.xml.bind.helpers.AbstractMarshallerImpl.marshal(AbstractMarshallerImpl.java:75)
    at example.Demo.main(Demo.java:18)

关于string - 当字符串为空但不为空时,如何防止在 JAXB 中编码空标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6110612/

相关文章:

Java字符串索引越界困惑

c# - 释放资源-TagLib文件的artwork标签

objective-c - Objective-C 中的标签实现

java - 同一 jar 文件中的两个相同的类

string - 两个字符串之间的 ASCII 差异

java - 我无法将字符串转换为整数(来自 csv 文件)-输入字符串 : "4" 错误

string - MATLAB 将时间打印为字符串

html - mustache 模板中的双 curl `{{ }}` 和三 curl `{{{ }}}` 有什么区别?

java - 在 Java 中解码为数组或 arrayList

java - JAXB:缺少命名空间