Использование Jaxb2Marshaller с несколькими классами, имеющими одинаковое имя @XmlRootElement

Я работаю над веб-службой, используя spring-mvc и Jaxb2Marshaller.

У меня есть два класса, оба аннотированы одним и тем же именем @XmlRootElement.

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

}

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

}

Все три класса (AbstractRequest, Foo, Bar) включены в список classToBeBound в одинаковом порядке

Теперь запрос, использующий Bar, работает нормально. Но тот, который использует Foo, выдает исключение ClassCastException во время демаршалинга с сообщением Bar cannot be cast to Foo

Код контроллера таков,

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

Я думаю это происходит потому, что Bar как бы переопределяет Foo, поскольку он написан после Foo в списке классов, которые должны быть связаны в файле spring-servlet.xml

Однако у меня также есть несколько классов, аннотированных с помощью @XmlRootElement(name="response"), и сортировка ответа не вызывает никаких проблем.

Есть ли способ указать класс, который будет использоваться jaxb2Marshaller для десортировки?


person naiquevin    schedule 03.03.2011    source источник
comment
Нет, нет никакого способа сделать это. Вам нужно реорганизовать свой дизайн, чтобы они отличались друг от друга.   -  person skaffman    schedule 03.03.2011


Ответы (2)


Вы можете передать класс Jaxb2Marshaller перед демаршалированием:

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

Foo request = (Foo) jaxb2Marshaller.unmarshal(source);
person Jtsay    schedule 13.05.2016

Вы можете создать Unmarshaller из Jaxb2Marshaller, затем вы можете передать класс, который хотите отменить, в качестве параметра методу unmarshal, который принимает источник:

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

Для получения дополнительной информации см.:

person bdoughan    schedule 14.03.2011