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

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

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

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

}

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

}

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

Теперь запрос, который использует Bar, работает нормально. Но тот, который использует Foo, генерирует исключение ClassCastException во время unmarshalling с сообщением 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 для unmarshalling?

Ответ 1

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

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

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

Ответ 2

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

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

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