这是我到目前为止使用JAXB编组我的POJO:
@XmlRootElement
public class Local {
private Entity entity;
public void setEntity(Entity entity) {
this.entity = entity;
}
@XmlElement
public Entity getEntity() {
return entity;
}
}
和
@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...
}
有了这个,我得到这样的东西:
<local>
<entity name="" comment=""></entity>
</local>
但是,我更希望将name属性作为local的属性:
<local entityName="" entityComment=""></local>
XmlJavaTypeAdapter是一个好的开始吗?
谢谢, 亚历
答案 0 :(得分:5)
有几种不同的选项可以处理这个用例:
选项#1 - XmlAdapter(任何JAXB实现)
您可以在此用例中使用XmlAdapter
。只要只有一个属性值来自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;
}
}
本地强> 的
使用@XmlJavaTypeAdapter
注释将XmlAdapter与字段/属性链接:
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;
}
}
了解更多信息
选项#2 - @XmlPath(EclipseLink JAXB(MOXy)
或者,如果您使用EclipseLink JAXB (MOXy),则可以使用@XmlPath
扩展名。这对于Entity
对象对应多个XML属性非常有用:
本地强> 的
指定XPath“。”表示子内容将被写入父元素
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;
}
}
<强>实体强> 的
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;
}
}
了解更多信息