我使用Jersey通过HTTP REST服务发送和接收XML,同时在JAXB注释类中表示数据。收到Response
后,我需要调用response.readEntity(Foo.class)
,以便将响应解组为Foo
的实例。
通常在JAXB解组过程中,您可以使用Schema
来验证输入,但是在读取实体的响应时我没有找到任何相同的选项。
这对我们很重要,因为我们有XSD文件定义输入的格式,我们想要针对这些模式进行验证。目前,我唯一的想法是将Response
读入String
,手动创建JAXBContext
并将模式分配给Unmarshaller
,然后再将String
解组为Foo
的实例。虽然这听起来并不那么可怕,但希望有更简洁的方法来做到这一点?
答案 0 :(得分:0)
您需要从JAXB API实现ValidationEventHandler接口。
Blaise Doughan有一个很好的博客描述了工作流程here。
答案 1 :(得分:0)
好的,所以我解决这个问题的方法是我将响应读入一个字符串,然后将其手动解组成一个对象。以下是执行此操作的函数的源代码:
public static <T> T unmarshal(Response response, Class<T> entityClass, Schema schema) {
String responseStr = response.readEntity(String.class);
try {
JAXBContext context = JAXBContext.newInstance(entityClass);
Unmarshaller unmarshaller = context.createUnmarshaller();
unmarshaller.setSchema(schema);
try (StringReader responseReader = new StringReader(responseStr)) {
return (T) unmarshaller.unmarshal(responseReader);
}
} catch (JAXBException e) {
logger.log(Level.SEVERE, "Error during response unmarshalling", e);
}
return null;
}
我认为这是一种黑客/解决方法,而不是一个正确的解决方案,但它可以完美地运作。