xmlrootelement tutorial jaxbelement ejemplo create jaxb

jaxb - tutorial - Campo de objetos Marshall como atributo



jaxbelement to xml (1)

Hay un par de opciones diferentes para manejar este caso de uso:

Opción n. ° 1 - XmlAdapter (Cualquier implementación de JAXB)

Puede usar un XmlAdapter para este caso de uso. Esto funcionará siempre que solo provenga un valor de atributo del objeto Entity :

EntityAdapter

import javax.xml.bind.annotation.adapters.XmlAdapter; public class EntityAdapter extends XmlAdapter<String, Entity>{ @Override public String marshal(Entity entity) throws Exception { if(null == entity) { return null; } return entity.getName(); } @Override public Entity unmarshal(String name) throws Exception { Entity entity = new Entity(); entity.setName(name); return entity; } }

Local

El XmlAdapter está vinculado con el campo / propiedad usando la anotación @XmlJavaTypeAdapter :

import javax.xml.bind.annotation.XmlAttribute; import javax.xml.bind.annotation.XmlRootElement; import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter; @XmlRootElement public class Local { private Entity entity; public void setEntity(Entity entity) { this.entity = entity; } @XmlAttribute @XmlJavaTypeAdapter(EntityAdapter.class) public Entity getEntity() { return entity; } }

Para más información

Opción # 2 - @XmlPath (EclipseLink JAXB (MOXy)

Alternativamente, si está utilizando EclipseLink JAXB (MOXy) , podría usar la extensión @XmlPath . Esto es útil con el objeto Entity corresponde a múltiples atributos XML:

Local

Especificando el XPath "." indicó que los contenidos secundarios se escribirán en el elemento padre

import javax.xml.bind.annotation.*; import org.eclipse.persistence.oxm.annotations.*; @XmlRootElement public class Local { private Entity entity; public void setEntity(Entity entity) { this.entity = entity; } @XmlPath(".") public Entity getEntity() { return entity; } }

Entidad

public class Entity { private String name; private String comment; public void setName(String name){ this.name = name; } @XmlAttribute(name="entityName") public String getName(){ return this.name; } public void setComment(String comment){ this.comment = comment; } @XmlAttribute(name="entityComment") public String getComment(){ return this.comment; } }

Para más información

Esto es lo que tengo hasta ahora para ordenar mi POJO usando JAXB:

@XmlRootElement public class Local { private Entity entity; public void setEntity(Entity entity) { this.entity = entity; } @XmlElement public Entity getEntity() { return entity; } }

y

@XmlRootElement public class Entity { private String name; private String comment; public void setName(String name){ this.name = name; } @XmlAttribute public String getName(){ return this.name; } public void setComment... @XmlAttribute public void getComment... }

Con eso, obtengo algo como esto:

<local> <entity name="" comment=""></entity> </local>

Sin embargo, preferiría tener el atributo de nombre como un atributo del local:

<local entityName="" entityComment=""></local>

¿Es el XmlJavaTypeAdapter una buena forma de comenzar?

Gracias, Alex