Je viens de trouver un cas curieux de JAXB avec mon collègue.non nillable encore requis et valeur nulle
J'ai déclaré un champ avec @XmlElement(required = true)
qui est nillable = false
par défaut.
Mais j'ai, par hasard, essayé de marshall une instance avec la valeur de null.
Et j'ai vu que l'élément est simplement omis. Est-ce normal? Est-ce juste la faute d'un programmeur?
import java.io.*;
import javax.xml.bind.*;
import javax.xml.bind.annotation.*;
import javax.xml.transform.*;
import javax.xml.transform.stream.*;
@XmlAccessorType(XmlAccessType.NONE)
@XmlRootElement
public class Doughan {
public static void main(final String[] args) throws JAXBException, IOException {
final JAXBContext context =
JAXBContext.newInstance(Doughan.class);
final Marshaller marshaller = context.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
System.out.println("\n------------------------------------- not valid, is it?");
marshaller.marshal(new Doughan(), System.out);
System.out.println("\n------------------------------------------------- valid");
marshaller.marshal(new Doughan("Blaise"), System.out);
System.out.println("\n------------------------------------------------ schema");
context.generateSchema(new SchemaOutputResolver(){
@Override public Result createOutput(final String namespaceUri,
final String suggestedFileName)
throws IOException {
return new StreamResult(System.out) {
@Override public String getSystemId() {
return "Do I really have to do this?";
}
};
}
});
}
public Doughan() {
this(null);
}
public Doughan(final String name) {
super();
this.name = name;
}
@XmlElement(required = true) // default; nillable = false
private String name;
@XmlElement(nillable = true, required = true)
private String nill = null;
}
Voici ce que j'ai obtenu.
------------------------------------- not valid, is it?
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<doughan>
<nill xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nil="true"/>
</doughan>
-------------------------------------- valid, isn't it?
<?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>
------------------------------------------------ schema
<?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>
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
$
Avec égards.
Merci pour votre réponse. Donc un élément qui a 'nillable = false' et' required = true' peut être omis si la valeur est 'null' qui conduit le document ** invalide par rapport au schéma **? Serait-il plus commode si un Marshaller se plaint pour nous? Joyeux Noël, de toute façon. –
@JinKwon - Vous pouvez toujours définir une instance de 'Schema' sur le' Marshaller' pour que JAXB se plaigne lorsqu'un document non valide est en cours de rassemblement: http://blog.bdoughan.com/2010/12/jaxb-and-marshalunmarshal -schema.html –