Использование Jaxb2Marshaller с несколькими классами с одинаковым именем @XmlRootElement - PullRequest
10 голосов
/ 03 марта 2011

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

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

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

}

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

}

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

Теперь запрос, который использует 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 для демаршаллинга?

Ответы [ 2 ]

4 голосов
/ 13 мая 2016

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

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

Foo request = (Foo) jaxb2Marshaller.unmarshal(source);
3 голосов
/ 14 марта 2011

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

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

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

...