Unmarshalling xml avec JAXB - espace de noms avec XmlType et proporder

Je suis en train de unmarshal un fichier xml à l'aide de JAXB. Quand je suis à l'aide de @XmlElement avec le bon nom et l'espace de la unmarshalling (par exemple, @XmlElement(name = "nom" namespace="http://www.test.com"))

Si j'utilise XmlType avec propOrder il n'est malheureusement pas plus (par exemple, @XmlType(namespace="http://www.test.com", nom = "", propOrder = {"nom", "description"})).

Le contenu du fichier xml (test.xml):

<Operation xmlns="http://www.test.com">
  <Parameter>
    <name>Param1</name>
    <description>Description of Parameter1</description>
  </Parameter>
  <Parameter>
    <name>Param2</name>
    <description>Description of Parameter2</description>
  </Parameter>
</Operation>

Le contenu de JAXBExample.java est:

package stackoverflow.problem.jaxb.ns;

import java.io.FileNotFoundException;
import java.io.FileReader;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Unmarshaller;

public class JAXBExample {

  public static void main(String[] args) throws JAXBException, FileNotFoundException   {
  String xmlFilename = "test.xml";

    JAXBContext context = JAXBContext.newInstance(Operation.class);

    System.out.println("Output from our XML File: ");
    Unmarshaller um = context.createUnmarshaller();
    Operation op = (Operation) um.unmarshal(new FileReader(xmlFilename));

    System.out.println("Operation-Content: " + op);
  }

}

Le contenu de

paquet de stackoverflow.problème.jaxb.ns;

import java.util.List;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;


@XmlRootElement(name="Operation", namespace="http://www.test.com")
@XmlAccessorType(XmlAccessType.FIELD)

public class Operation {

  @XmlElement(name = "Parameter", namespace="http://www.test.com")
  List<Parameter> parameterList;

  @Override
  public String toString(){
    String retVal = "";
    for(Parameter currentParameter: parameterList){
      retVal += currentParameter.toString() + "\n";
    }   
    return retVal;
  }
}

Et le Contenu de Parameter.java est:

package stackoverflow.problem.jaxb.ns;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;

@XmlType(namespace="http://www.test.com", name = "", propOrder = {"name", "description"})
@XmlAccessorType(XmlAccessType.FIELD)
public class Parameter {

  //@XmlElement(name = "name", namespace="http://www.test.com")
  String name;

  //@XmlElement(name = "description", namespace="http://www.test.com")
  String description;

  @Override
  public String toString(){
    return this.name + "\t" + this.description;
  }
}

Si je décommentez les deux @XmlElement lignes dans le dernier bloc de code (Parameter.java), la unmarshalling fonctionne très bien. Si ces deux lignes ne sont pas inclus, les deux champs dans le Paramètre de l'objet sont nulles. Est-il une autre façon de déclarer un espace de noms lors de l'utilisation de propOrder dans XmlType? Ou ai-je fais quelque chose de mal?

OriginalL'auteur Exocom | 2012-12-04