使用具有相同@XmlRootElement名称的多个类的Jaxb2Marshaller

时间:2011-03-03 08:28:45

标签: spring-mvc jaxb jaxb2

我正在使用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

进行解组时,使用Foo的人会抛出ClassCastException异常

控制器代码就是这个,

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

我猜这种情况正在发生,因为Bar是一种覆盖Foo,因为它是在Spring的servlet.xml文件中绑定的类列表中的Foo之后写的

但是我也有多个用@XmlRootElement(name="response")注释的类,并且编组响应没有任何问题。

有没有办法指定jaxb2Marshaller用于解组的类?

2 个答案:

答案 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(); 

有关详细信息,请参阅: