2016-11-29 67 views
0

我正在尋找一種方法,可以在通過Web服務發佈它們時通過JAXB輕鬆更改對象列表的元素名稱。這裏是例子:JAXB:爲對象列表註釋元素標記名稱的簡單方法

說我有一個對象我想要序列化到XML:

@XmlRootElement(name = "greeting") 
public class TestClassForSo { 

    public String id; 
    public List<String> description; 
} 

而且我有一個發佈這些對象作爲XML列表的Web服務:

@GET 
@Path("/so-test") 
@Produces({AgiMediaType.APPLICATION_XML, AgiMediaType.APPLICATION_JSON}) 
@XmlElementWrapper(name = "wrapperName") 
public List<TestClassForSo> getGreetings() { 

    List<TestClassForSo> greetingList = new ArrayList<>(); 

    TestClassForSo greeting = new TestClassForSo(); 

    String id = "hello-word"; 
    List<String> greetings = new ArrayList<>(Arrays.asList("Hello World, 
                  Bonjour le monde, 
                  Hallo Welt, 
                  Hola Mundo")); 

    greeting.id = id; 
    greeting.description = greetings; 

    greetingList.add(greeting); 

    return greetingList; 
} 

我得到以下結果,當我通過一個HTTP GET請求調用資源:

<testClassForSoes> 
    <greeting> 
     <id>hello-word</id> 
     <description>Hello World, Bonjour le monde, Hallo Welt, Hola Mundo</description> 
    </greeting> 
</testClassForSoes> 

有一封asy的方式來將列表的元素名稱更改爲greetings,而不是將其放入包裝方法或編寫自己的序列化機制等?

顯然,由於命名約定,我無法更改TestClassForSo的名稱。

作爲一個側面的問題,這個問題真的很重要,除了使它對人類更具可讀性什麼是列表的元素名稱?

謝謝你考慮這個問題。任何幫助表示讚賞。我已經研究過網絡上的類似問題,但沒有任何內容似乎完全適合我的問題。

問候

回答

1

由於already stated here

你不能只用JAXB實現這一點,因爲註釋將不得不 穿上ArrayList類本身。

的解決辦法是在使用傑克遜ObjectWriter的方法: withRootName()


不過,我認爲是相當簡單的多創造這個你自己的包裝類,因爲澤西不允許根域名定製:

@XmlRootElement(name = "greetings") 
public class RootClass { 

    @XmlElement(name = "greeting") 
    public List<TestClassForSo> greetingList; 

} 

,改變你的方法的策略以下,如:

@GET 
@Path("/so-test") 
@Produces({AgiMediaType.APPLICATION_XML, AgiMediaType.APPLICATION_JSON}) 
public RootClass getGreetings() { 
    List<TestClassForSo> greetingList = new ArrayList<>(); 

    for (int i = 0; i < 3; i++) { 
     TestClassForSo testClassForSo = new TestClassForSo(); 

     String id = "hello-word"; 
     List<String> greetings = new ArrayList<>(Arrays.asList("Hello World " + i)); 
     testClassForSo.id = id; 
     testClassForSo.description = greetings; 

     greetingList.add(testClassForSo); 
    } 

    RootClass r = new RootClass(); 
    r.greetingList = greetingList; 
    return r; 
} 

然後,我們就會有最終結果:

<greetings> 
    <greeting> 
     <id>hello-word</id> 
     <description>Hello World 0</description> 
    </greeting> 
    <greeting> 
     <id>hello-word</id> 
     <description>Hello World 1</description> 
    </greeting> 
    <greeting> 
     <id>hello-word</id> 
     <description>Hello World 2</description> 
    </greeting> 
</greetings> 
+0

您好,感謝您的答覆。這就是我最終做的。您分享的鏈接有助於未來的JAXB努力者。 – Scyla101

相關問題