2011-08-30 63 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)可用於映射對象模型的地方。 –