我正在使用spring-mvc和Jaxb2Marshaller开发Web服务。
我有两个类,都使用相同的@XmlRootElement
名称
@XmlRootElement(name="request")
class Foo extends AstractRequest {
}
@XmlRootElement(name="request")
class Bar extends AbstractRequest {
}
所有三个类(AbstractRequest,Foo,Bar)都以相同的顺序包含在classesToBeBound列表中
现在使用Bar的请求工作正常。但是,在使用消息Bar cannot be cast to Foo
控制器代码就是这个,
Source source = new StreamSource(new StringReader(body));
Foo request = (Foo) this.jaxb2Marshaller.unmarshal(source);
我猜这种情况正在发生,因为Bar是一种覆盖Foo,因为它是在Spring的servlet.xml文件中绑定的类列表中的Foo之后写的
但是我也有多个用@XmlRootElement(name="response")
注释的类,并且编组响应没有任何问题。
有没有办法指定jaxb2Marshaller用于解组的类?
答案 0 :(得分:4)
您可以在unmarshal之前将类传递给Jaxb2Marshaller:
Source source = new StreamSource(new StringReader(body));
jaxb2Marshaller.setMappedClass(Foo.class);
Foo request = (Foo) jaxb2Marshaller.unmarshal(source);
答案 1 :(得分:3)
您可以从Jaxb2Marshaller创建一个Unmarshaller,然后您可以将要解组的类作为参数传递给带有Source的unmarshal方法:
Source source = new StreamSource(new StringReader(body));
Unmarshaller unmarshaller = jaxb2Marshaller.createUnmarshaller();
Foo request = (Foo) unmarshaller.unmarshal(source, Foo.class).getValue();
有关详细信息,请参阅: