2011-03-03 14 views
10

Estoy trabajando en un servicio web utilizando spring-mvc y Jaxb2Marshaller.Uso de Jaxb2Marshaller con varias clases con el mismo nombre de @XmlRootElement

Tengo dos clases, tanto anotado con el mismo nombre @XmlRootElement

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

} 

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

} 

Las tres clases (AbstractRequest, Foo, Bar) están incluidos en la lista classesToBeBound en el mismo orden

Ahora la solicitud que usa Bar funciona bien. Pero el que utiliza Foo emite una excepción ClassCastException durante unmarshalling con el mensaje Bar cannot be cast to Foo

El código del controlador es esto,

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

supongo esto está sucediendo porque Bar es una especie de anular Foo, ya que está escrito después Foo en la lista de clases que se enlazará en el archivo spring-servlet.xml

Sin embargo, también tengo varias clases anotadas con @XmlRootElement(name="response") y la respuesta no da ningún problema.

¿Hay alguna manera de especificar la clase que utilizará jaxb2Marshaller para desasignar?

+2

No, no hay forma de hacerlo. Necesita refactorizar su diseño para mantenerlos separados el uno del otro. – skaffman

Respuesta

3

Se puede crear un Unmarshaller del Jaxb2Marshaller, entonces puede pasar de la clase que desea deserializar como un parámetro para el método unmarshal que se lleva a Fuente:

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

Para obtener más información, véase:

4

puede pasar a la clase Jaxb2Marshaller antes unmarshal:

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

Foo request = (Foo) jaxb2Marshaller.unmarshal(source); 
Cuestiones relacionadas