2009-10-09 30 views
5

我有許多使用Jersey直接編組和解組的JAXB bean。JAXB集合(列表<T>)使用Pascal Case來代替元素名稱的駝峯案例

E.g.

@XmlAccessorType(XmlAccessType.FIELD) 
@XmlType(name = "Artifact", propOrder = { 
    "artifactId", 
    "artifactType", 
    "contentHash" 
}) 
@XmlSeeAlso({ 
    EmailArtifact.class, 
    ManagedDocArtifact.class 
}) 
@XmlRootElement(name ="Artifact") 
public class Artifact { 

    protected String artifactId; 
    protected String artifactType; 
    protected String contentHash; 

... 
... 
... 

} 

如果我創建一個返回單個工件對象的GET方法。它正確地產生XML:

<Artifact> 
<artifactId>293289392839283</artifactId> 
<artifactType>EMAIL</artifactType> 
<contentHash>2837873827322</contentHash> 
</Artifact> 

在這裏,我已經能夠成功地控制了神器元素的名稱有一個大寫字母「A」開頭。

不過,我創建一個返回神器對象的集合的GET方法,我結束了:

<artifacts> 
<Artifact> 
<artifactId>293289392839283</artifactId> 
<artifactType>EMAIL</artifactType> 
<contentHash>2837873827322</contentHash> 
</Artifact> 
<Artifact> 
<artifactId>293289392839283</artifactId> 
<artifactType>EMAIL</artifactType> 
<contentHash>2837873827322</contentHash> 
</Artifact> 
</artifacts> 

正如你所看到的集合有一個小寫的「A」外部元素。爲了符合我們自己的內部標準,我希望這是一個資本「A」 - Artifacts。

我看不到在JAXB中可以定義的位置,它實際上是控制它的Jersey框架嗎?

我們可以控制爲集合生成的元素名稱嗎?

非常感謝,

詹姆斯

+1

1. AFAIK JAXB不允許你馬歇爾集合(例如ArrayList的'')這樣。但它允許您序列化一個具有集合作爲屬性的對象。 2。我對Jersey並不熟悉,但是我想你需要知道JAXB是否是單獨序列化每個工件的JAXB,以及其他某個層(Jersey)是否構建了塊的整個文檔,還是JAXB是否爲該集合生成了XML。 3.你可以發佈一些代碼(或在某處發佈) - 如何調用它?我正在嘗試使用簡單的JAXB,但這並不能模擬您的設置。 – 2009-10-09 18:49:40

+1

我懷疑你是對的 - 它是澤西,它允許我編組/收集JAXB bean(我已經向澤西島用戶組提出了這個問題)。因此,我希望有一些配置可以讓我爲集合的XML元素名稱設置名稱或規則......我們將拭目以待。正如您所指出的,一種解決方法是創建一個新的JAXB bean - 比如說具有單個集合成員的「Artifacts」,例如列表工件 - 我覺得雖然引入了一大堆沒有增加價值的類。感謝幫助。 James – jallch 2009-10-10 10:25:22

回答

9

嘗試使用@XmlElementWrapper它支持name屬性:

@XmlElementWrapper(name="ELEMENTS") 
@XmlElement(name="ELEMENT") 
protected final List<String> elements = new LinkedList<String>(); 

會產生

<ELEMENTS> 
    <ELEMENT>one</ELEMENT> 
    <ELEMENT>two</ELEMENT> 
    ... 
</ELEMENTS> 

此功能查看JAXB Tutorial

+1

您好,不幸的是我知道XmlElementWrapper,但它不適用於我的用例。在Jersey中,您可以生成並使用JAXB bean的集合。例如 public List getMyBeans 您不能使用XmlElementWrapper來註釋MyBean類 - 您只能對該類的某個屬性使用此註釋,例如,班內的集合。所以這不會有好處。有一個解決方案,我可以使用一個包含集合的新類 - 但老實說,這是在設計中創建一個並非真正需要的類。 – jallch 2009-10-10 10:21:52

+0

關於XML的好處是:它可以用1000種方式進行轉換;) 您可以使用** XSLT **或** DOM **。 – 2009-10-10 11:39:55

+0

非常感謝,您的解決方案解決了列表序列化的另一個問題。 – Pragmateek 2011-05-12 21:40:58

5

好的 - 我已經從Java澤西社區負責人Paul Sandoz那裏得到了更新。目前這是Jersey框架的一個懸而未決的問題,只是我們必須解決或接受,直到它在未來的更新中得到解決。

上述註釋之一所述的解決方法是爲每個返回JAXB註釋bean的集合(例如List)的Web服務方法引入一個新類。這個類實際上是一個只包含一個成員的類 - 一個JAXB bean列表。而不是在Web服務方法中返回List,而是返回特殊類。因爲我們可以控制XML中新類的名稱,例如@XmlRootElement(name =「Artifacts」)我們可以在短期內解決這個問題。

希望這會有所幫助。

問候,

詹姆斯

+0

你知道目前澤西島版本(1.11)是否有解決方案嗎? 或任何指向澤西島討論/問題的功能? – Yaegor 2012-01-05 14:49:39

相關問題