验证客户响应 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");
}
}
}
}
我们使用 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");
}
}
}
}