2011-03-03 127 views
10

我正在使用spring-mvc和Jaxb2Marshaller進行Web服務。使用Jaxb2Marshaller與具有相同@XmlRootElement名稱的多個類

我有兩個類,都具有相同@XmlRootElement

@XmlRootElement(name="request") 
class Foo extends AstractRequest { 

} 

@XmlRootElement(name="request") 
class Bar extends AbstractRequest { 

} 

所有三類(AbstractRequest,富,酒吧)都包含在同一順序

現在請求classesToBeBound列表註釋使用Bar的工作正常。但隨着消息Bar cannot be cast to Foo

控制器代碼是這樣解組期間使用美孚的一個拋出一個ClassCastException例外,

Source source = new StreamSource(new StringReader(body)); 
Foo request = (Foo) this.jaxb2Marshaller.unmarshal(source); 

我想 發生這種情況,因爲酒吧是那種因爲它是後寫覆蓋的Foo在Spring-servlet.xml文件中要綁定的類列表中的Foo

但是,我也有多個類用@XmlRootElement(name="response")註解,並且編組響應不會給出任何問題。

有沒有辦法指定jaxb2Marshaller用於解組的類?

+2

不,沒有辦法做到這一點。你需要重構你的設計,以保持彼此不同。 – skaffman 2011-03-03 13:15:30

回答

3

您可以從Jaxb2Marshaller創建的Unmarshaller,那麼你可以通過你想要解組作爲參數,需要一個源解組方法的類:

Source source = new StreamSource(new StringReader(body)); 
Unmarshaller unmarshaller = jaxb2Marshaller.createUnmarshaller(); 
Foo request = (Foo) unmarshaller.unmarshal(source, Foo.class).getValue(); 

欲瞭解更多信息,請參閱:

4

您可以通過類來Jaxb2Marshaller前解組:

Source source = new StreamSource(new StringReader(body)); 
jaxb2Marshaller.setMappedClass(Foo.class); 

Foo request = (Foo) jaxb2Marshaller.unmarshal(source); 
相關問題