tutorial tipo saxexception2 podido objeto jaxbelement jaxbcontext istack example español ejemplo convertir canalizar java xml jaxb marshalling unmarshalling

java - tipo - jaxbelement ejemplo



Código de Java a XML/XSD sin usar Anotación (4)

¿Has mirado XStream ? Deserializará / deserializará un POJO estándar sin anotaciones ni XSD. Puede proporcionar personalizaciones para afectar la forma en que los elementos aparecen en el XML y prácticamente funciona de fábrica.

Necesito ordenar y deshacer una clase de Java a XML. La clase no es de mi propiedad, no puedo agregar anotaciones para poder usar JAXB.

¿Hay una buena manera de convertir Java a XML con el contraint dado?

Además, pensé que una herramienta podría ser útil, pero me interesaría más que haya alguna API de Java para hacer lo mismo.


Puede escribir un XmlAdapter personalizado y anotar campos del tipo restringido con una anotación XmlJavaTypeAdapter . Lo básico sería algo como esto:

public enum CannotBeAnnotated { value1, value2; } @XmlRootElement(name="client") public class ClientClass { @XmlJavaTypeAdapter(Bridge.class) public CannotBeAnnotated; } @XmlRootElement(name="representation") public class XmlType { @XmlValue public String value; } public class Bridge extends XmlAdapter<XmlType, CannotBeAnnotated>{ public XmlType marshal(CannotBeAnnotated c) { XmlType x=new XmlType(); x.value=c.name(); return x; } public CannotBeAnnotated unmarshall(XmlType x) { return CannotBeAnnotated.valueOf(x.value); } }

Por supuesto para enums esto no sería útil ya que JAXB sabe cómo tratar con ellos. Acabo de elegir una enumeración por simplicidad para que pueda ver la idea:

  1. Diseña una representación XML que controlas
  2. Escriba un adaptador convirtiendo ese tipo de Java en el tipo deseado
  3. Anote el código de "cliente" que hace referencia al adaptador para el tipo deseado
  4. Lucro.


Nota: Soy el líder de EclipseLink JAXB (MOXy) y miembro del grupo de expertos JAXB (JSR-222) .

MODELO DE DOMINIO

Usaré el siguiente modelo de dominio para esta respuesta. Tenga en cuenta que no hay anotaciones JAXB en el modelo.

Cliente

package forum11693552; import java.util.*; public class Customer { private String firstName; private String lastName; private List<PhoneNumber> phoneNumbers = new ArrayList<PhoneNumber>(); public String getFirstName() { return firstName; } public void setFirstName(String firstName) { this.firstName = firstName; } public String getLastName() { return lastName; } public void setLastName(String lastName) { this.lastName = lastName; } public List<PhoneNumber> getPhoneNumbers() { return phoneNumbers; } public void setPhoneNumbers(List<PhoneNumber> phoneNumbers) { this.phoneNumbers = phoneNumbers; } }

Número de teléfono

package forum11693552; public class PhoneNumber { private String type; private String number; public String getType() { return type; } public void setType(String type) { this.type = type; } public String getNumber() { return number; } public void setNumber(String number) { this.number = number; } }

OPCIÓN Nº 1: Implementación de cualquier JAXB (JSR-222)

JAXB es una configuración por excepción, esto significa que solo necesita agregar anotaciones donde desee que el comportamiento de la asignación difiera del predeterminado. A continuación se muestra un enlace a un ejemplo que demuestra cómo usar cualquier JAXB impl sin anotaciones:

Manifestación

package forum11693552; import javax.xml.bind.*; import javax.xml.namespace.QName; public class Demo { public static void main(String[] args) throws Exception { JAXBContext jc = JAXBContext.newInstance(Customer.class); Customer customer = new Customer(); customer.setFirstName("Jane"); customer.setLastName("Doe"); PhoneNumber workPhone = new PhoneNumber(); workPhone.setType("work"); workPhone.setNumber("555-1111"); customer.getPhoneNumbers().add(workPhone); Marshaller marshaller = jc.createMarshaller(); marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); JAXBElement<Customer> rootElement = new JAXBElement<Customer>(new QName("customer"), Customer.class, customer); marshaller.marshal(rootElement, System.out); } }

Salida

<customer> <firstName>Jane</firstName> <lastName>Doe</lastName> <phoneNumbers> <number>555-1111</number> <type>work</type> </phoneNumbers> </customer>

Para más información

OPCIÓN # 2 - Documento de mapeo externo de EclipseLink JAXB (MOXy)

Si desea personalizar las asignaciones, entonces puede interesarle la extensión del documento de mapeo externo de MOXy. Un documento de mapeo de muestra tiene el siguiente aspecto:

oxm.xml

<?xml version="1.0"?> <xml-bindings xmlns="http://www.eclipse.org/eclipselink/xsds/persistence/oxm" package-name="forum11693552"> <java-types> <java-type name="Customer"> <xml-root-element /> <java-attributes> <xml-element java-attribute="firstName" name="first-name" /> <xml-element java-attribute="lastName" name="last-name" /> <xml-element java-attribute="phoneNumbers" name="phone-number" /> </java-attributes> </java-type> <java-type name="PhoneNumber"> <java-attributes> <xml-attribute java-attribute="type" /> <xml-value java-attribute="number" /> </java-attributes> </java-type> </java-types> </xml-bindings>

jaxb.properties

Para habilitar MOXy como su proveedor JAXB, debe incluir un archivo llamado jaxb.properties en el mismo paquete que su modelo de dominio con la siguiente entrada (consulte: http://blog.bdoughan.com/2011/05/specifying-eclipselink- moxy-as-your.html ):

javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory

Manifestación

Al usar EclipseLink MOXy como su proveedor JAXB (consulte), puede aprovechar el documento de mapeo externo cuando JAXBContext su JAXBContext

package forum11693552; import java.util.*; import javax.xml.bind.*; import javax.xml.namespace.QName; import org.eclipse.persistence.jaxb.JAXBContextFactory; public class Demo { public static void main(String[] args) throws Exception { Map<String, Object> properties = new HashMap<String,Object>(1); properties.put(JAXBContextFactory.ECLIPSELINK_OXM_XML_KEY, "forum11693552/oxm.xml"); JAXBContext jc = JAXBContext.newInstance(new Class[] {Customer.class}, properties); Customer customer = new Customer(); customer.setFirstName("Jane"); customer.setLastName("Doe"); PhoneNumber workPhone = new PhoneNumber(); workPhone.setType("work"); workPhone.setNumber("555-1111"); customer.getPhoneNumbers().add(workPhone); Marshaller marshaller = jc.createMarshaller(); marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); JAXBElement<Customer> rootElement = new JAXBElement<Customer>(new QName("customer"), Customer.class, customer); marshaller.marshal(rootElement, System.out); } }

Salida

<?xml version="1.0" encoding="UTF-8"?> <customer> <first-name>Jane</first-name> <last-name>Doe</last-name> <phone-number type="work">555-1111</phone-number> </customer>

Para más información