java - ejemplo - jaxb xml to pojo
JAXB y ordenamiento de propiedad (8)
Quiero que el resultado XML serializado de mi clase Java respete el orden de las propiedades en la clase Java.
Parece que JAXB ordena alfabéticamente.
Puedo anular esto usando @XmlType
con propOrder y especificando TODAS las propiedades, pero tengo una clase con muchas propiedades y estas aún no están finalizadas.
Leí que especificar un propOrder vacío lo haría pero no es así.
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 de propiedad de mi clase):
<customerPlan2>
<Company>company</Company>
<Scheme>scheme</Scheme>
<AgreementNumber>agreementnumber</AgreementNumber>
</customerPlan2>
gracias por cualquier ayuda en esto.
De acuerdo con esto , el orden de los elementos XML hermanos no está garantizado.
Es posible usar:
@XmlType (propOrder={"prop1","prop2",..."propN"})
Simplemente elimine el comentario del código así:
//@XmlType(propOrder={"company", "scheme", "agreementNumber"})
Este es el uso correcto.
Este hilo es viejo, 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 marque como transitorio xml, o no están decorados en absoluto, deben formar parte de
@XmlRootElement(name = "Product")
@XmlType(name="",propOrder={"productName","productVersion",..."propN"})
... ¡reconozco que no tengo suficiente POR QUÉ funciona! :)
@XmlType(propOrder={"company", "scheme", "agreementNumber"})
Es correcto, pero ¿has probado esto?
@XmlType(propOrder={"Company", "Scheme", "AgreementNumber"})
En @XmlType(propOrder={"prop1", "prop2"})
puede declarar solo propertyName
que haya declarado en la clase. No puedes declarar
XMLElement name (
@XmlElement(name="Company"))
en XmlType
propOrder
como se menciona arriba ...
Solo agrega :
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(propOrder={"field1", "field2", ...})
propOrder
agregar las propOrder
y XmlAccessType
a la clase.
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(propOrder = {"PartyType","PartyName","PartyAddress"})
Nota: Dirijo EclipseLink JAXB (MOXy)
El orden en que la reflexión de Java devuelve la lista de campos / propiedades no está garantizado. Esta es la razón por la cual las implementaciones JAXB no lo usan para determinar el orden de los elementos.
Por defecto, JAXB no ofrece pedidos garantizados . Sin embargo, la mayoría (si no todas las implementaciones de JAXB) usan ordenamientos alfabéticos ya que es determinista. Para garantizar este orden, debe anotar su clase de la siguiente manera:
@XmlAccessorOrder(XmlAccessOrder.ALPHABETICAL)
public class Foo {
...
}