使用模式的JAX-RS响应验证

时间:2016-12-08 11:38:22

标签: java xml xsd jaxb jax-rs

我使用Jersey通过HTTP REST服务发送和接收XML,同时在JAXB注释类中表示数据。收到Response后,我需要调用response.readEntity(Foo.class),以便将响应解组为Foo的实例。

通常在JAXB解组过程中,您可以使用Schema来验证输入,但是在读取实体的响应时我没有找到任何相同的选项。

这对我们很重要,因为我们有XSD文件定义输入的格式,我们想要针对这些模式进行验证。目前,我唯一的想法是将Response读入String,手动创建JAXBContext并将模式分配给Unmarshaller,然后再将String解组为Foo的实例。虽然这听起来并不那么可怕,但希望有更简洁的方法来做到这一点?

2 个答案:

答案 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;
}

我认为这是一种黑客/解决方法,而不是一个正确的解决方案,但它可以完美地运作。