JAXB生成nillable=";“真的”;来自java

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代码中的这样

这是虫子吗

我需要在xsd模式中使用
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
,那么将调用setter
setDateFromXml(final Date Date fromXML)
将字段设置为
null
——与xml具有
xsi:nil=“true”时的行为相同”
。这个问题有解决方案吗?谢谢!当我将
@xmlement(nillable=true)
放在getter上,并检查setter是否被调用以将字段设置为
null
时,它起作用了。只有一个小问题:如果我有
type=“xs:dateTime”的元素
然后我有一个
private Date-dateFromXml
字段。如果xml中的日期没有正确设置,比如
blablabla
,那么将调用setter
setDateFromXml(final Date-Date-dateFromXml)
将字段设置为
null
-与xml具有
xsi:nil=“true”时的行为相同
。是否有解决此问题的方法?