Marshall对象字段作为属性

时间:2011-08-30 16:01:43

标签: jaxb

这是我到目前为止使用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是一个好的开始吗?

谢谢, 亚历

1 个答案:

答案 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;
    }
}

了解更多信息