验证客户响应 CXF

Validating Client responses CXF

我们使用 Apache CXF 和 Dropwizard-JAXWS 与 SOAP 服务进行交互。我们想在客户端验证响应。

我们试过这个:

((BindingProvider)port).getRequestContext().put("schema-validation-enabled", "true"); 

来自 http://cxf.apache.org/faq.html 构建客户端时,没有运气。

我们最接近的是为客户端编写拦截器并将以下内容添加到消息中

public class ClientResponseSchemaValidatingInterceptor extends AbstractSoapInterceptor {

public ClientResponseSchemaValidatingInterceptor() {
    super(Phase.RECEIVE);
}

@Override
public void handleMessage(SoapMessage message) {
    message.put(Message.SCHEMA_VALIDATION_ENABLED, validationEnabled);
    message.getExchange().getInMessage().put(Message.SCHEMA_VALIDATION_ENABLED, validationEnabled);
    message.getExchange().put(Message.SCHEMA_VALIDATION_ENABLED, validationEnabled);
}

}

这似乎验证了强制属性是否存在,但不是内容(即匹配 xsd 中的正则表达式)

在记录的实现方法失败后,我创建了一个自定义拦截器来验证消息。

public class ClientResponseSchemaValidatingInterceptor extends AbstractSoapInterceptor {

private Marshaller marshaller= null;

public ClientResponseSchemaValidatingInterceptor() {
    super(Phase.PRE_INVOKE);

    SchemaFactory schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
    try {
        Schema schema =
            schemaFactory.newSchema(this.getClass().getClassLoader().getResource("schema/your-xsd.xsd"));

        marshaller = JAXBContext.newInstance(YourModelClass.class).createMarshaller();
        marshaller.setSchema(schema);
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
    } catch (SAXException | JAXBException ex) {
        log.error("Error creating marshaller",ex);
    }

}

@Override
public void handleMessage(SoapMessage message) {
    List contents = message.getContent(List.class);

    if (contents!=null){
        String responseType = contents.get(0).getClass().getSimpleName();
        try {
              marshaller.marshal(contents.get(0), new DefaultHandler())
            }
        } catch (JAXBException ex){
            log.info("Failed validation",ex);
            throw new RuntimeException("Validation Error");
        }
    }
}

}