use*_*745 1 java jaxb jaxbelement xml-nil
这是一个错误吗?
我需要nillable = "true"
在xsd模式中。从我的Java代码生成此类元素的唯一方法是使用@XmlElement(nillable = true)
,对吗?但是在这种情况下,我将无法利用此定义,也无法检查元素是否设置为nil
。该方法isNil()
在JAXBElement
包装器类中。
因此,我在这里有哪些选择-我想nillable = "true"
在我的xsd模式中生成并能够检查它是否从我的Java代码中设置。
我的xsd架构中需要nillable =“ true”。从我的Java代码生成此类元素的唯一方法是使用@XmlElement(nillable = true),对吗?
是。
但是在这种情况下,我将无法利用此定义,也无法检查元素是否设置为nil。方法isNil()在JAXBElement包装器类中。
您getFoo() == null
可以确定它是否为空。如果您试图确定null是否对应于一个缺少的元素,xsi:nil="true"
那么您将不得不做更多的事情。不会为不存在的节点设置集合,因此您可以在setter中放入逻辑以跟踪是否由于使用元素而将设置为null的结果xsi:nil="true
。
@XmlElement(nillable=true)
public String getFooString() {
return fooString;
}
public void setFooString(String foo) {
this.fooString = foo;
this.setFoo = true;
}
Run Code Online (Sandbox Code Playgroud)
如果您不想拥有这种额外的逻辑(无论如何都无法进行编组,则需要利用JAXBElement
。
@XmlElementRef(name="fooJAXBElement")
public JAXBElement<String> getFooJAXBElement() {
return fooJAXBElement;
}
public void setFooJAXBElement(JAXBElement<String> fooJAXBElement) {
this.fooJAXBElement = fooJAXBElement;
}
Run Code Online (Sandbox Code Playgroud)
根
import javax.xml.bind.JAXBElement;
import javax.xml.bind.annotation.*;
@XmlRootElement
@XmlType(propOrder={"fooString", "barString", "fooJAXBElement", "barJAXBElement"})
public class Root {
private String fooString;
private String barString;
private JAXBElement<String> fooJAXBElement;
private JAXBElement<String> barJAXBElement;
private boolean setFoo;
private boolean setBar;
@XmlElement(nillable=true)
public String getFooString() {
return fooString;
}
public void setFooString(String foo) {
this.fooString = foo;
this.setFoo = true;
}
public boolean isSetFooString() {
return setFoo;
}
@XmlElement(nillable=true)
public String getBarString() {
return barString;
}
public void setBarString(String bar) {
this.barString = bar;
this.setBar = true;
}
public boolean isSetBarString() {
return setBar;
}
@XmlElementRef(name="fooJAXBElement")
public JAXBElement<String> getFooJAXBElement() {
return fooJAXBElement;
}
public void setFooJAXBElement(JAXBElement<String> fooJAXBElement) {
this.fooJAXBElement = fooJAXBElement;
}
@XmlElementRef(name="barJAXBElement")
public JAXBElement<String> getBarJAXBElement() {
return barJAXBElement;
}
public void setBarJAXBElement(JAXBElement<String> barJAXBElement) {
this.barJAXBElement = barJAXBElement;
}
}
Run Code Online (Sandbox Code Playgroud)
对象工厂
import javax.xml.bind.JAXBElement;
import javax.xml.bind.annotation.*;
import javax.xml.namespace.QName;
@XmlRegistry
public class ObjectFactory {
@XmlElementDecl(name="fooJAXBElement")
public JAXBElement<String> createFooJAXBElement(String string) {
return new JAXBElement<String>(new QName("fooJAXBElement"), String.class, string);
}
@XmlElementDecl(name="barJAXBElement")
public JAXBElement<String> createBarJAXBElement(String string) {
return new JAXBElement<String>(new QName("barJAXBElement"), String.class, string);
}
}
Run Code Online (Sandbox Code Playgroud)
下面是一个完整的示例,以演示上述概念。
input.xml
本文档包含2个用显式标记的元素xsi:nil="true"
和2个其他不存在的映射元素。
<?xml version="1.0" encoding="UTF-8"?>
<root>
<barString xsi:nil="true" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"/>
<barJAXBElement xsi:nil="true" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"/>
</root>
Run Code Online (Sandbox Code Playgroud)
演示版
该演示代码将读取上面的XML,并检查是否由于解组而设置了属性。
import java.io.File;
import javax.xml.bind.*;
public class Demo {
public static void main(String[] args) throws Exception {
JAXBContext jc = JAXBContext.newInstance(Root.class, ObjectFactory.class);
Unmarshaller unmarshaller = jc.createUnmarshaller();
File xml = new File("src/forum20076018/input.xml");
Root root = (Root) unmarshaller.unmarshal(xml);
System.out.println("Was fooString set? " + root.isSetFooString());
System.out.println("Was barString set? " + root.isSetBarString());
System.out.println("Was fooJAXBElement set? " + (root.getFooJAXBElement() != null));
System.out.println("Was barJAXBElement set? " + (root.getBarJAXBElement() != null));
Marshaller marshaller = jc.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.marshal(root, System.out);
}
}
Run Code Online (Sandbox Code Playgroud)
输出量
以下是运行演示代码的输出。我们看到所有的set set检查都是正确的,但是输出仅与JAXBElement
属性的输入完全匹配。
Was fooString set? false
Was barString set? true
Was fooJAXBElement set? false
Was barJAXBElement set? true
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<root>
<fooString xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nil="true"/>
<barString xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nil="true"/>
<barJAXBElement xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nil="true"/>
</root>
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
14534 次 |
最近记录: |