2011-03-25 28 views
55

Quiero que el resultado XML serializado de mi clase Java respete el orden de las propiedades en la clase Java.JAXB y orden de propiedad

Parece que JAXB ordena alfabéticamente.

que puede cambiar este comportamiento usando @XmlType con propOrder y especificar todas las propiedades, pero tengo una clase con muchas propiedades y éstas aún no se han finalizado.

leí que la especificación de un vacío propOrder lo haría pero no lo hacen.

Mi clase de ejemplo:

package test; 

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

@XmlRootElement 
//@XmlType(propOrder={"company", "scheme", "agreementNumber"}) 
@XmlType(propOrder={}) // makes no difference - still alphabetical in XML 
public class CustomerPlan2 { 

    private String company; 
    private String scheme; 
    private String agreementNumber; 

    @XmlElement(name="Company") 
    public String getCompany() { 
     return company; 
    } 
    public void setCompany(String company) { 
     this.company = company; 
    } 

    @XmlElement(name="Scheme") 
    public String getScheme() { 
     return scheme; 
    } 
    public void setScheme(String scheme) { 
     this.scheme = scheme; 
    } 

    @XmlElement(name="AgreementNumber") 
    public String getAgreementNumber() { 
     return agreementNumber; 
    } 
    public void setAgreementNumber(String agreementNumber) { 
     this.agreementNumber = agreementNumber; 
    } 
} 

Mi código de serialización:

CustomerPlan2 cp2 = new CustomerPlan2(); 

    cp2.setCompany("company"); 
    cp2.setScheme("scheme"); 
    cp2.setAgreementNumber("agreementnumber"); 
    JAXBContext context = JAXBContext.newInstance(CustomerPlan2.class); 
    Marshaller marshaller = context.createMarshaller(); 

    marshaller.marshal(cp2, new FileWriter("C:\\temp\\out.xml")); 

Salida:

<customerPlan2> 
     <AgreementNumber>agreementnumber</AgreementNumber> 
     <Company>company</Company> 
     <Scheme>scheme</Scheme> 
    </customerPlan2> 

Quiero que mi salida sea (como el orden propiedad de mi clase) :

<customerPlan2> 
     <Company>company</Company> 
     <Scheme>scheme</Scheme> 
     <AgreementNumber>agreementnumber</AgreementNumber> 
    </customerPlan2> 

Gracias por cualquier ayuda sobre esto.

Respuesta

22

Nota: llevo EclipseLink JAXB (MOXy)

El orden en el que la reflexión de Java devuelve la lista de campos/propiedades no está garantizada. Esta es la razón por la cual las implementaciones JAXB no lo usan para determinar el orden de los elementos.

Por defecto, JAXB proporciona no guaranteed ordering. Sin embargo, la mayoría (si no todas las implementaciones de JAXB) usan ordenamientos alfabéticos ya que es determinista. Para garantizar este pedido debe anotar la clase de la siguiente manera:

@XmlAccessorOrder(XmlAccessOrder.ALPHABETICAL) 
public class Foo { 
    ... 
} 
+1

¿Esto también debería funcionar con las propiedades heredadas de su superclase? –

+0

Hice esto y obtuve el orden alfa inverso cuando ejecuté la clasificación en un entorno y el orden alfa normal cuando ejecuté la clasificación en otro entorno. ¿Alguna idea/sugerencia? – Achilles929

1

Según this, el orden de los hermanos elementos XML no está garantizada.

59

Es posible usando:

@XmlType (propOrder={"prop1","prop2",..."propN"}) 

Simplemente elimine el comentario de código como este:

//@XmlType(propOrder={"company", "scheme", "agreementNumber"}) 

Este es el uso correcto.

+0

Verdadero: http://jaxb.java.net/tutorial/section_6_2_2-Annotation-for-Classes-XmlType.html#Annotation%20for%20Classes:%20XmlType –

3

Este hilo es antiguo, pero vale la pena arrojar cómo obtuve mis propiedades para generar xml en el orden correcto y NO utilizar el orden alfabético, ya que no era deseado. Una cosa a tener en cuenta es que estoy usando wink y jaxb, que pueden comportarse de manera diferente que otros proveedores. Wink fue muy específico sobre lo que estaba en la lista de propiedades. Incluso los elementos que marquen como transitoria XML, o no decorada en absoluto fueron obligados a ser parte de

@XmlRootElement(name = "Product") 
@XmlType(name="",propOrder={"productName","productVersion",..."propN"}) 

... la verdad es que no hacen lo suficiente de por qué funciona! :)

+1

El atributo de nombre en la anotación XmlType no es necesario, solo el propOrder atributo es suficiente, es decir, @XmlType (propOrder = {"productName", "productVersion", ... "propN"}) – Michael

4
@XmlType(propOrder={"company", "scheme", "agreementNumber"}) 

¡Es correcto, pero ¿has probado esto?

@XmlType(propOrder={"Company", "Scheme", "AgreementNumber"}) 
0

En @XmlType(propOrder={"prop1", "prop2"}) puede declarar solamente propertyName se declaró en la clase. No se puede declarar

XMLElement name (
@XmlElement(name="Company")) 

en el XmlTypepropOrder como se ha mencionado anteriormente .. por

1

Sólo añadir:

@XmlAccessorType(XmlAccessType.FIELD) 
@XmlType(propOrder={"field1", "field2", ...}) 
0

hay que añadir los propOrder y las anotaciones XmlAccessType a la clase.

@XmlAccessorType(XmlAccessType.FIELD) 

@XmlType(propOrder = {"PartyType","PartyName","PartyAddress"}) 
+0

voto a favor: duplicado – Murmel

Cuestiones relacionadas