Jaxb 不可为零,但为空值

Jaxb 不可为零,但为空值,jaxb,Jaxb,我刚刚和我的同事发现了一个关于JAXB的奇怪案例 我用@xmlement(required=true)声明了一个字段,默认值为nillable=false 但我无意中尝试使用null值封送一个实例 我看到元素被省略了。这正常吗?这只是程序员的错吗 import java.io.*; 导入javax.xml.bind.*; 导入javax.xml.bind.annotation.*; 导入javax.xml.transform.*; 导入javax.xml.transform.stream.*;

我刚刚和我的同事发现了一个关于JAXB的奇怪案例

我用
@xmlement(required=true)
声明了一个字段,默认值为
nillable=false

但我无意中尝试使用null值封送一个实例

我看到元素被省略了。这正常吗?这只是程序员的错吗

import java.io.*;
导入javax.xml.bind.*;
导入javax.xml.bind.annotation.*;
导入javax.xml.transform.*;
导入javax.xml.transform.stream.*;
@XmlAccessorType(XmlAccessType.NONE)
@XmlRootElement
公务舱道格汉{
公共静态void main(最终字符串[]args)抛出jaxbeexception、IOException{
最终JAXBContext上下文=
newInstance(Doughan.class);
final Marshaller=context.createMarshaller();
setProperty(marshaller.JAXB_格式的_输出,Boolean.TRUE);
System.out.println(“\n-------------------------------------------无效,是吗?”);
marshaller.marshall(新的Doughan(),System.out);
System.out.println(“\n------------------------------------------有效”);
marshaller.Marshall(新道格汉(“布莱斯”),System.out;
System.out.println(“\n-------------------------------------------schema”);
generateSchema(新的SchemaOutputResolver(){
@重写公共结果createOutput(最终字符串namespaceUri,
建议的最终字符串(文件名)
抛出IOException{
返回新的StreamResult(System.out){
@重写公共字符串getSystemId(){
return“我真的必须这样做吗?”;
}
};
}
});
}
公共道根(){
这个(空);
}
公共Doughan(最终字符串名){
超级();
this.name=名称;
}
@xmlement(required=true)//默认值;nillable=false
私有字符串名称;
@XmlElement(nillable=true,required=true)
私有字符串nill=null;
}
这是我得到的

-------------------------------------无效,是吗?
--------------------------------------有效,不是吗?
布莱斯
------------------------------------------------模式
xmllint

$ head -n100 doughan.xsd doughan1.xml doughan2.xml
==> doughan.xsd <==
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<xs:schema version="1.0" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="doughan" type="doughan"/>
  <xs:complexType name="doughan">
    <xs:sequence>
      <xs:element name="name" type="xs:string"/>
      <xs:element name="nill" type="xs:string" nillable="true"/>
    </xs:sequence>
  </xs:complexType>
</xs:schema>
==> doughan1.xml <==
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<doughan>
    <nill xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nil="true"/>
</doughan>
==> doughan2.xml <==
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<doughan>
    <name>Blaise</name>
    <nill xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nil="true"/>
</doughan>

$ xmllint --schema doughan.xsd doughan1.xml
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<doughan>
    <nill xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nil="true"/>
</doughan>
Element 'nill': This element is not expected. Expected is ( name ).
doughan1.xml fails to validate

$ xmllint --schema doughan.xsd doughan2.xml
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<doughan>
    <name>Blaise</name>
    <nill xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nil="true"/>
</doughan>
doughan2.xml validates

$
$head-n100 doughan.xsd doughan1.xml doughan2.xml

==>doughan.xsd doughan1.xml doughan2.xml是,如果元素未使用
@xmlement(nillable=true)
注释,则xml文档中将忽略空值

了解更多信息


注意:我猜你的问题是针对我的:)。

谢谢你的回答。因此,如果值为
null
,则可以忽略具有
nillable=false
required=true
的元素,从而导致文档对架构无效?如果马歇尔先生为我们投诉会更方便吗?无论如何,圣诞快乐。@JinKwon-您可以在
Marshaller
上设置
Schema
的实例,以便在封送无效文档时让JAXB投诉: