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
- http://blog.bdoughan.com/2010/07/xmladapter-jaxbs-secret-weapon.html
- http://blog.bdoughan.com/2010/12/jaxb-and-immutable-objects.html
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