Java 您可以更改JAXB中nillable属性的默认值吗?

Java 您可以更改JAXB中nillable属性的默认值吗?,java,jaxb,Java,Jaxb,我正在重构一些代码以使用JAXB和反射将代码输出到客户机,目前它正在使用XMLWriter并每次手动创建标记 我遇到的问题是,由于客户端的限制,我需要在XML中为java类中的任何空字段设置空元素 虽然我意识到这个问题可以通过向每个JAXBxmlement注释添加nillable=true来解决,但这并不是最实际的,因为我有很多这样的注释 我希望找到一种方法将nillable=true设置为全局属性(或默认值)。这也使得未来的同事更容易处理它,因为他们不需要记住每个注释都应该包含nillable

我正在重构一些代码以使用JAXB和反射将代码输出到客户机,目前它正在使用XMLWriter并每次手动创建标记

我遇到的问题是,由于客户端的限制,我需要在XML中为java类中的任何空字段设置空元素

虽然我意识到这个问题可以通过向每个JAXB
xmlement
注释添加
nillable=true
来解决,但这并不是最实际的,因为我有很多这样的注释

我希望找到一种方法将
nillable=true
设置为全局属性(或默认值)。这也使得未来的同事更容易处理它,因为他们不需要记住每个注释都应该包含
nillable
属性


除了对默认行为的描述之外,我还没有找到太多。我感到惊讶的是,过去没有其他人提出过类似的问题。从我发现的情况来看,似乎没有任何内置的支持来配置默认设置。这是可以通过自定义JAXB实现或第三方JAXB实现解决的问题吗

注意:我是该专家组的负责人和成员

我已经输入了一个增强请求,将此行为添加到EclipseLink JAXB(MOXy)中:

解决问题

作为一种解决方法,如果所有映射的字符串字段/属性都映射到XML元素,那么以下XmlAdapter方法可能适合您:

NullStringAdapter

XmlAdapter
String
的实例封送为名为
AdaptedString
的对象
AdaptedString
包含
String
值以及映射到
xsi:nil
属性的字段。在
XmlAdapter
中,我们将根据
String
值是否为空来设置该字段的值

package forum8841221;

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

public class NullStringAdapter extends XmlAdapter<NullStringAdapter.AdaptedString, String> {

    @Override
    public AdaptedString marshal(String v) throws Exception {
        AdaptedString adaptedString = new AdaptedString();
        if(null == v) {
            adaptedString.nil = true;
        }
        adaptedString.value = v;
        return adaptedString;
    }

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

    public static class AdaptedString {

        @XmlAttribute(namespace="http://www.w3.org/2001/XMLSchema-instance")
        public Boolean nil;

        @XmlValue
        @XmlJavaTypeAdapter(VoidStringAdapter.class)
        public String value;

    }

    public static class VoidStringAdapter extends XmlAdapter<String, String> {

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

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

    }

}
根目录

<?xml version="1.0" encoding="UTF-8"?>
<root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
   <a xsi:nil="true"/>
   <b>B</b>
   <c xsi:nil="true"/>
   <d xsi:nil="true"/>
</root>
下面是我在本例中使用的域类。它有几个字符串属性,其中一个用@XmlElement(nillable=true)注释

演示

package forum8841221;

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);

        Root root = new Root();
        root.setB("B");

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

}
输出

<?xml version="1.0" encoding="UTF-8"?>
<root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
   <a xsi:nil="true"/>
   <b>B</b>
   <c xsi:nil="true"/>
   <d xsi:nil="true"/>
</root>

B
<?xml version="1.0" encoding="UTF-8"?>
<root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
   <a xsi:nil="true"/>
   <b>B</b>
   <c xsi:nil="true"/>
   <d xsi:nil="true"/>
</root>