2011-03-03 12 views
10

Spring-mvc ve Jaxb2Marshaller kullanarak bir web hizmetinde çalışıyorum.Jaxb2Marshaller'ı aynı @XmlRootElement adı olan birden çok sınıfla kullanma

İki sınıf var, hem

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

} 

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

} 

Tüm üç sınıfa (AbstractRequest Foo, Bar)

Şimdi aynı sırayla

isteği içinde classesToBeBound listesinde bulunan aynı @XmlRootElement adıyla açıklamalı Bar kullanan iyi çalışıyor. Ama Foo kullanan bir Bar bunun sonrasında yazıldığı beri Foo basan türüdür çünkü oluyor ben bu tahmin

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

, mesajın Bar cannot be cast to Foo

kontrolör kod şudur ile unmarshalling sırasında ClassCastException istisna atar

Spring-servlet.xml dosyasında bağlanacak sınıfların listesinde Foo Ayrıca, @XmlRootElement(name="response") ile açıklamalı birden çok sınıfım var ve yanıtı bildirme, herhangi bir sorun vermez.

jaxb2Marshaller tarafından unmarshalling için kullanılacak sınıfı belirtmenin bir yolu var mı?

+2

Hayır, bunu yapmanın bir yolu yok. Tasarımlarınızı birbirinden ayırt etmek için yeniden düzenlemelisiniz. – skaffman

cevap

3

Daha sonra size bir Kaynak alır unmarshal yönteme parametre olarak unmarshal istediğiniz sınıfı geçebilir, Jaxb2Marshaller bir unmarshaller oluşturabilirsiniz: bkz fazla bilgi için

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

:

4

Sen unmarshal önce Jaxb2Marshaller için sınıfını geçebilir:

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

Foo request = (Foo) jaxb2Marshaller.unmarshal(source); 
İlgili konular