2010-02-22 92 views
5

比方說,我有我的域對象制定了這樣的XML看起來是這樣的:有沒有辦法在JAXB中配置渲染深度?

<account id="1"> 
    <name>Dan</name> 
    <friends> 
    <friend id="2"> 
     <name>RJ</name> 
    </friend> 
    <friend id="3"> 
     <name>George</name> 
    </friend> 
    </friends> 
</account> 

我的域對象:

@XmlRootElement 
public class Account { 
    @XmlAttribute 
    public Long id; 
    public String name; 

    @XmlElementWrapper(name = "friends") 
    @XmlElement(name = "friend") 
    public List<Account> friends; 
} 

有一種簡單的方法來配置JAXB只渲染到深度2?意思是,我想我的XML看起來像這樣:

<account id="1"> 
    <name>Dan</name> 
    <friends> 
     <friend id="2" /> 
     <friend id="3" /> 
    </friends> 
</account> 
+1

不與JAXB,沒有。儘管如此,您應該能夠將JAXB的輸出傳遞給其他一些XML操作過程。 – skaffman 2010-02-22 22:41:32

回答

3

您可以使用XmlJavaTypeAdapter做到這一點。

更改帳戶如下:

@XmlRootElement 
public class Account { 
    @XmlAttribute 
    public Long id; 
    public String name; 

    @XmlElementWrapper(name = "friends") 
    @XmlElement(name = "friend") 
    @XmlJavaTypeAdapter(value = AccountAdapter.class) 
    public List<Account> friends; 
} 

AccountAdapter.java:

public class AccountAdapter extends XmlAdapter<AccountRef, Account> 
{ 
    @Override 
    public AccountRef marshal(Account v) throws Exception 
    { 
     AccountRef ref = new AccountRef(); 
     ref.id = v.id; 
     return ref; 
    } 

    @Override 
    public Account unmarshal(AccountRef v) throws Exception 
    { 
     // Implement if you need to deserialize 
    } 
} 

AccountRef.java:

@XmlRootElement 
public class AccountRef 
{ 
    @XmlAttribute 
    public Long id; 
} 
+0

你有沒有討厭這個?我相當肯定這是行不通的,即使類簽名提出了另外的建議,「XmlJavaTypeAdapter」只能處理標量字符串值,而不能處理整個XML元素。 – skaffman 2010-02-23 08:39:02

+0

@skaffman - 是的,我測試了它(儘管我注意到我忘記了包含AccountRef的定義 - 我已經更新了我的答案)。關鍵是XMLJavaTypeAdapter不僅可以序列化JAXB不知道的類,還可以更改每個字段序列化的類。在這裏,我創建了一個新的類,它僅序列化帳戶的ID字段。 – mtpettyp 2010-02-23 12:53:18

相關問題