Java 您可以更改JAXB中nillable属性的默认值吗?
我正在重构一些代码以使用JAXB和反射将代码输出到客户机,目前它正在使用XMLWriter并每次手动创建标记 我遇到的问题是,由于客户端的限制,我需要在XML中为java类中的任何空字段设置空元素 虽然我意识到这个问题可以通过向每个JAXBJava 您可以更改JAXB中nillable属性的默认值吗?,java,jaxb,Java,Jaxb,我正在重构一些代码以使用JAXB和反射将代码输出到客户机,目前它正在使用XMLWriter并每次手动创建标记 我遇到的问题是,由于客户端的限制,我需要在XML中为java类中的任何空字段设置空元素 虽然我意识到这个问题可以通过向每个JAXBxmlement注释添加nillable=true来解决,但这并不是最实际的,因为我有很多这样的注释 我希望找到一种方法将nillable=true设置为全局属性(或默认值)。这也使得未来的同事更容易处理它,因为他们不需要记住每个注释都应该包含nillable
xmlement
注释添加nillable=true
来解决,但这并不是最实际的,因为我有很多这样的注释
我希望找到一种方法将nillable=true
设置为全局属性(或默认值)。这也使得未来的同事更容易处理它,因为他们不需要记住每个注释都应该包含nillable
属性
除了对默认行为的描述之外,我还没有找到太多。我感到惊讶的是,过去没有其他人提出过类似的问题。从我发现的情况来看,似乎没有任何内置的支持来配置默认设置。这是可以通过自定义JAXB实现或第三方JAXB实现解决的问题吗 注意:我是该专家组的负责人和成员 我已经输入了一个增强请求,将此行为添加到EclipseLink JAXB(MOXy)中:
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>