JAXB生成nillable=";“真的”;来自java
这是虫子吗 我需要在xsd模式中使用JAXB生成nillable=";“真的”;来自java,java,jaxb,xml-nil,jaxbelement,Java,Jaxb,Xml Nil,Jaxbelement,这是虫子吗 我需要在xsd模式中使用nillable=“true”。从java代码生成这样一个元素的唯一方法是使用@xmlement(nillable=true),对吗?但在这种情况下,我将无法利用此定义,我将无法检查元素是否设置为nil。方法isNil()位于JAXBElement包装类中 那么,我的选项是什么呢?我想在xsd模式中生成nillable=“true”,并能够检查它是否是从java代码中设置的 我需要在xsd模式中使用nillable=“true”。生成 我的java代码中的这样
nillable=“true”
。从java代码生成这样一个元素的唯一方法是使用@xmlement(nillable=true)
,对吗?但在这种情况下,我将无法利用此定义,我将无法检查元素是否设置为nil
。方法isNil()
位于JAXBElement
包装类中
那么,我的选项是什么呢?我想在xsd模式中生成nillable=“true”
,并能够检查它是否是从java代码中设置的
我需要在xsd模式中使用nillable=“true”。生成
我的java代码中的这样一个元素是使用@XmlElement(nillable)=
没错,对吧
对
但在这种情况下,我将无法利用这一点
定义,我将无法检查元素是否设置为nil。
方法isNil()位于JAXBElement包装器类中
您可以执行getFoo()==null
来确定它是否为null。如果您试图确定null是否对应于缺少的元素或xsi:nil=“true”
,那么您必须做更多的工作。将不会对缺少的节点进行设置,因此您可以在setter中放入逻辑,以跟踪是否由于具有xsi:nil=“true
的元素而将设置为null
@XmlElement(nillable=true)
public String getFooString() {
return fooString;
}
public void setFooString(String foo) {
this.fooString = foo;
this.setFoo = true;
}
如果您不想拥有这个额外的逻辑(这对编组没有任何帮助),您需要利用JAXBElement
@XmlElementRef(name="fooJAXBElement")
public JAXBElement<String> getFooJAXBElement() {
return fooJAXBElement;
}
public void setFooJAXBElement(JAXBElement<String> fooJAXBElement) {
this.fooJAXBElement = fooJAXBElement;
}
演示
此演示代码将读入上述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);
}
}
输出
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;
}
}
下面是运行演示代码的输出。我们看到所有的设置检查都是正确的,但是输出只与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>
是否设置了fooString?false
条形码设置好了吗?是的
fooJAXBElement设置好了吗?错误
barJAXBElement设置好了吗?是的
我需要在xsd模式中使用nillable=“true”。这是生成
我的java代码中的这样一个元素是使用@XmlElement(nillable)=
没错,对吧
对
但在这种情况下,我将无法利用这一点
定义,我将无法检查元素是否设置为nil。
方法isNil()位于JAXBElement包装器类中
您可以执行getFoo()==null
来确定它是否为null。如果您试图确定null是否对应于缺少的元素或xsi:nil=“true“
那么您将不得不做更多的工作。不会对缺少的节点进行设置,因此您可以在setter中放入逻辑,以跟踪是否由于元素具有xsi:nil=“true
而将设置为null
@XmlElement(nillable=true)
public String getFooString() {
return fooString;
}
public void setFooString(String foo) {
this.fooString = foo;
this.setFoo = true;
}
如果您不想拥有这个额外的逻辑(这对编组没有任何帮助),您需要利用JAXBElement
@XmlElementRef(name="fooJAXBElement")
public JAXBElement<String> getFooJAXBElement() {
return fooJAXBElement;
}
public void setFooJAXBElement(JAXBElement<String> fooJAXBElement) {
this.fooJAXBElement = fooJAXBElement;
}
演示
此演示代码将读入上述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);
}
}
输出
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;
}
}
下面是运行演示代码的输出。我们看到所有的设置检查都是正确的,但是输出只与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>
是否设置了fooString?false
条形码设置好了吗?是的
fooJAXBElement设置好了吗?错误
barJAXBElement设置好了吗?是的
xs:nil=true和null
是否相同?因此,如果您的元素在xml中设置为nil,您的字段在java中将为null。xs:nil=true和null
是否相同?因此,如果您的元素在xml中设置为nil,您的字段在java中将为null。谢谢!当我放置@XmlElement(nillable=true)时
并检查setter是否已被调用以将字段设置为null
它可以工作。只有一个小问题:如果我有type=“xs:dateTime”元素“
那么我有一个私有日期日期从xml
字段。如果xml中的日期没有正确设置,比如blabla
,那么将调用settersetDateFromXml(final Date Date fromXML)
将字段设置为null
——与xml具有xsi:nil=“true”时的行为相同”
。这个问题有解决方案吗?谢谢!当我将@xmlement(nillable=true)
放在getter上,并检查setter是否被调用以将字段设置为null
时,它起作用了。只有一个小问题:如果我有type=“xs:dateTime”的元素
然后我有一个private Date-dateFromXml
字段。如果xml中的日期没有正确设置,比如blablabla
,那么将调用settersetDateFromXml(final Date-Date-dateFromXml)
将字段设置为null
-与xml具有xsi:nil=“true”时的行为相同
。是否有解决此问题的方法?