2013-02-13 35 views
2

首先,我是JAXB和Spring世界的新手,所以如果我錯過了非常明顯的事情,我會非常感激,如果有人可以指出而不是回覆。 :)我嘗試在這裏尋找解決方案,但找不到一個好的答案。@XmlSeeAlso繼承

我有一堆繼承自同一抽象類A的子類DTO(稱爲A1,A2,A3)。我希望我的休息查詢的結果返回子類類型的列表。我有以下類來表示結果

@XmlRootElement(name="result") 
@XmlSeeAlso({A1.class, A2.class, A3.class}) 
public class AResult<T> 
{ 
... 
} 

由於AResult是通用的,我想在@XmlSeeAlso也可以通用的,只是喜歡寫東西

@XmlSeeAlso({(subclasses of A.class}) 

但我不認爲這是可能的JAXB來自我在本網站和其他地方所做的研究。

  1. 由於我們使用註解驅動標籤的配置,它會自動使用Jaxb2RootElementHttpMessageConverter類。此消息轉換器使用@XmlSeeAlso中定義的類創建JaxbContext。 createMarshaller和getContext方法在超類中是不可變的。

  2. 由於第1點,我不能寫一個類,我可以檢查一個類是否是類A的子類,然後將它添加到JaxbContext。我無法使用自定義Jaxb2RootElementHttpMessageConverter或自定義Marshaller。

我該如何解決這個問題?順便說一句,我們正在使用春天版本3.1.3

感謝您的幫助。

+0

感謝您的幫助Donal。下面是我如何解決這個問題:1.創建一個擴展HttpMessageConverter的CustomJaxb2RootElementMessageConverter。 2.在我的自定義類中,將上下文作爲路徑傳遞,並在這些包中包含jaxb.in​​dex文件。 3.更改了AnnotationMethodHandlerAdapter和RequestMappingHandlerAdapter的messageConverters以使用我的Custom類。 – srjxtd 2013-02-25 22:21:31

回答

2

JAXB不掃描你的類路徑爲可能恰好是AResult子類(也將是相當慢!)班,而是依賴於context知道所有的,它可能曾經有創建類實例。所有@XmlSeeAlso註釋的作用是擴展與列出的其他類的上下文。

但是,還有其他一些方法。例如,您可以創建一個標有@XmlRegistry的類,該類知道如何製作您關心的子類。或者你可以嘗試使用@XmlJavaTypeAdapter。唉,我只有在自己的代碼中使用基於@XmlSeeAlso的方法才取得了進展,所以我無法從經驗中評論。