2012-12-21 2 views
3

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.

Répondre

3

Oui, si un élément n'est pas annoté avec @XmlElement(nillable=true), les valeurs NULL seront omises du document XML.

Pour plus Informatation

Note: Je devine que vous me ciblez avec cette question :).

+0

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. –

+1

@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 –

Questions connexes