mvc form spring-mvc jaxb jaxb2

spring mvc - form - Usando Jaxb2Marshaller con mĂșltiples clases que tienen el mismo nombre @XmlRootElement



spring mvc tags (2)

Estoy trabajando en un servicio web usando spring-mvc y Jaxb2Marshaller.

Tengo dos clases, ambas anotadas 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 incluidas en la lista classesToBeBound en el mismo orden

Ahora la solicitud que usa Bar funciona bien. Pero el que usa Foo arroja una excepción ClassCastException durante el desemparejamiento con mensaje. La Bar cannot be cast to Foo enviar 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 que esto está sucediendo porque Bar está sobrepasando a Foo, ya que está escrito después de 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 organizar la respuesta no da ningún problema.

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


Puede crear un Unmarshaller desde el Jaxb2Marshaller, luego puede pasar la clase que desea desempaquetar como un parámetro al método unmarshal que toma un Origen:

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

Para más información, ver:


Puede pasar la clase a Jaxb2Marshaller antes de unmarshal:

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