Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/399.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 转换为零=";“真的”;在解组操作期间设置为null_Java_Xml_Jaxb_Jaxb2_Xml Nil - Fatal编程技术网

Java 转换为零=";“真的”;在解组操作期间设置为null

Java 转换为零=";“真的”;在解组操作期间设置为null,java,xml,jaxb,jaxb2,xml-nil,Java,Xml,Jaxb,Jaxb2,Xml Nil,我从一个服务器接收XML,该服务器的模式将几乎每个元素都指定为: <xs:element name="myStringElementName" type="xs:string" nillable="true" minOccurs="0"/> <xs:element name="myIntElementName" type="xs:int" nillable="true" minOccurs="0"/> 应导致我的JAXB对象具有值为null的myIntElementNa

我从一个服务器接收XML,该服务器的模式将几乎每个元素都指定为:

<xs:element name="myStringElementName" type="xs:string" nillable="true" minOccurs="0"/>
<xs:element name="myIntElementName" type="xs:int" nillable="true" minOccurs="0"/>
应导致我的JAXB对象具有值为null的
myIntElementName
属性,而不是将nil属性设置为true(或任何类似于这些行的内容)的
JAXBElement
对象。我无法控制向我发送使用
nillable
属性的XML的系统,因此我需要在收到它时转换它。

@xmlement(nillable=true)

您只需在字段/属性上指定
@xmlement(nillable=true)
即可获得此行为:

@XmlElement(nillable=true)
private String foo;

从XML架构生成

下面我将演示如果您从XML模式开始,如何生成此映射

XMLSchema(Schema.xsd)

外部绑定文件(Binding.xml)

可以指定一个外部绑定文件,告诉JAXB实现不要生成任何类型为
JAXBElement
的属性。注意,这将使JAXB无法往返所有XML文档

<?xml version="1.0" encoding="UTF-8"?>
<jaxb:bindings version="2.0"
               xmlns:jaxb="http://java.sun.com/xml/ns/jaxb">
    <jaxb:bindings>
        <jaxb:globalBindings generateElementProperty="false"/>
    </jaxb:bindings>
</jaxb:bindings>
生成模型(Foo)

生成的模型将如下所示:

import javax.xml.bind.annotation.*;

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
    "myStringElementName",
    "myIntElementName"
})
@XmlRootElement(name = "foo")
public class Foo {

    @XmlElement(nillable = true)
    protected String myStringElementName;
    @XmlElement(nillable = true)
    protected Integer myIntElementName;

    public String getMyStringElementName() {
        return myStringElementName;
    }

    public void setMyStringElementName(String value) {
        this.myStringElementName = value;
    }

    public Integer getMyIntElementName() {
        return myIntElementName;
    }

    public void setMyIntElementName(Integer value) {
        this.myIntElementName = value;
    }

}

了解更多信息


最近有人告诉过你你很棒吗?如果你不介意的话,还有一个问题。我应该总是在JAXB类中注释属性而不是关联的getter/setter方法吗?注释getter(或setter)通常是最安全的做法。例如,如果您对JAXB和JPA使用相同的模型,那么JPA实现将修改字节码以支持在调用getter时触发的延迟加载。有关更多信息,请参阅:
<xs:element name="myStringElementName" type="xs:string"
                        nillable="true" minOccurs="0" />
<?xml version="1.0" encoding="UTF-8"?>
<jaxb:bindings version="2.0"
               xmlns:jaxb="http://java.sun.com/xml/ns/jaxb">
    <jaxb:bindings>
        <jaxb:globalBindings generateElementProperty="false"/>
    </jaxb:bindings>
</jaxb:bindings>
xjc -b binding.xml schema.xsd
import javax.xml.bind.annotation.*;

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
    "myStringElementName",
    "myIntElementName"
})
@XmlRootElement(name = "foo")
public class Foo {

    @XmlElement(nillable = true)
    protected String myStringElementName;
    @XmlElement(nillable = true)
    protected Integer myIntElementName;

    public String getMyStringElementName() {
        return myStringElementName;
    }

    public void setMyStringElementName(String value) {
        this.myStringElementName = value;
    }

    public Integer getMyIntElementName() {
        return myIntElementName;
    }

    public void setMyIntElementName(Integer value) {
        this.myIntElementName = value;
    }

}