2011-08-30 65 views
2

这里是我迄今为止马歇尔使用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 entityName="" entityComment=""></local> 

XmlJavaTypeAdapter是一种很好的开始方式吗?

谢谢, 亚历克斯

+0

你真的需要一个实体类?如果没有,只需在String getEntity()上放置一个@XmlAttribute。 –

+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; 
    } 

} 

本地

的XmlAdapter与字段/属性链接使用@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; 
    } 

} 

更多信息


选项#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; 
    } 
} 

更多信息

+0

是的,它的工作原理!而且,如果Entity类中有多个属性,并且我希望将它们编组为本地节点中的属性,那该怎么办?然后,我不能在getEntity()方法上使用@XmlAttribute。 –

+0

我在实体类中添加了另一个属性(注释)来澄清我的问题。 –

+0

@Alexandre Blanquart - 这是MOXy的'@ XmlPath'扩展名(选项#2)可用于映射对象模型的地方。 –