2016-07-14 1 views
0

Le problème est que je veux définir une valeur par défaut pour l'élément "name" qui est absent dans le fichier input.xml.Comment puis-je réaliser cela par Jaxb ?, Je ne veux pas le faire à travers le modèle java. Y at-il un moyen de l'obtenir à travers shema ou par Jaxb. est sous le code:comment définir la valeur par défaut pour l'élément si cet élément est absent dans le fichier xml via jaxb unmarshalling dans java

1. customer.xsd

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 

    <xs:element name="customer"> 
     <xs:complexType> 
      <xs:sequence> 
       <xs:element name="name" type="stringMaxSize5" minOccurs="0" default="ss"/> 
       <xs:element name="phone-number" type="xs:integer" minOccurs="0" default="200" /> 
      </xs:sequence> 
     </xs:complexType> 
    </xs:element> 
    <xs:simpleType name="stringMaxSize5"> 
     <xs:restriction base="xs:string"> 
      <xs:maxLength value="5"/> 
     </xs:restriction> 
    </xs:simpleType> 

</xs:schema> 

2. Customer.model

@XmlAccessorType(XmlAccessType.FIELD) 
@XmlType(name = "", propOrder = { 
    "name", 
    "phoneNumber" 
}) 
@XmlRootElement(name = "customer") 
public class Customer { 

    @XmlElement(defaultValue = "ss") 
    protected String name; 
    @XmlElement(name = "phone-number", defaultValue = "200") 
    protected BigInteger phoneNumber; 
    public String getName() { 
     return name; 
    } 
    public void setName(String value) { 
     this.name = value; 
    } 
    public BigInteger getPhoneNumber() { 
     return phoneNumber; 
    } 
    public void setPhoneNumber(BigInteger value) { 
     this.phoneNumber = value; 
    } 
} 

3. input.xml

<customer> 

</customer> 

Pour unmarshalling en utilisant le code ci-dessous:

SchemaFactory sf =SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI); 
Schema schema = sf.newSchema(new File("customer.xsd")); 

JAXBContext jc = JAXBContext.newInstance(Customer.class); 
Unmarshaller unmarshaller = jc.createUnmarshaller(); 
unmarshaller.setSchema(schema); 
Customer customer = (Customer) unmarshaller.unmarshal(new File("input.xml")); 
System.out.println(customer.getName() + " " + customer.getPhoneNumber()); 

En exécutant ce que je reçois la valeur nulle pour le nom et si j'utilise le fichier ci-dessous input.xml avec l'élément « name » je reçois la valeur par défaut pour le nom champ.

input.xml file: 
<customer><name/></customer> 

Alors, comment définir la valeur par défaut pour l'élément manquant par JAXB?

Répondre

0

La raison en est que votre document XML manque les éléments. Voir la JAXB guide

Lorsqu'une classe possède une propriété d'élément avec la valeur par défaut, et si le document que vous lisez est manque l'élément, puis l'unmarshaller ne remplit pas le champ avec la valeur par défaut. Au lieu de cela, le unmarshaller remplit dans le domaine où l'élément est présent mais le contenu est manquant

Essayez ce document d'entrée

<customer> 
    <name/> 
    <phone-number/> 
</customer> 
+0

oui cette façon, je reçois la valeur par défaut de l'élément, mais il y a un cas d'utilisation dans lequel je ne veux pas spécifier l'élément vide et même alors je veux définir la valeur par défaut. Alors est-il un moyen de faire cela? – Developer

+0

Selon la documentation n'est pas possible avec JAXB. Dans ce cas, vous pouvez définir la valeur par défaut dans le code Java 'String name =" default "; – pedrofb