使用具有默认POJO数据格式的camel-cxf组件托管了soap服务。想要进行模式验证,而错误需要返回自定义肥皂消息。
答案 0 :(得分:0)
有许多地方和许多技术可以做到这一点。这取决于您的要求和设计解决方案。
在请求到达Camel from
端点之后的第一个处理器之前,您可以通过其中一个入站CXF拦截器中的自定义代码执行此操作。
您可以使用Camel Validate组件(可能从这里开始查看:Apache Camel: Validation Component
前段时间,在玩了不同的方法后,我最终使用自定义处理器进行验证(由于我的要求 - 必须在Route内,必须一次提供所有错误/警告(不仅仅是第一个),必须创建自定义错误响应所有错误的详细信息,获得更好的性能等等......
我使用了标准javax.xml.validation
包。
该选项并不太难,但需要更多编码。
代码必须从XSD文件中创建javax.xml.validation.Schema
的实例。
它是线程安全的,可以缓存。
然后可以创建并使用它javax.xml.validation.Validator
。
它不是线程安全的,因此每次都必须创建新的。 (无论如何,这不是昂贵的操作。)
然后立即收集所有错误和警告而不是从第一个错误/ warrning自定义错误处理程序获取验证异常在这种情况下需要向验证程序提供实现org.xml.sax.ErrorHandler
接口的错误处理程序。在那里,您可以收集验证中的所有异常和警告,并在完成验证后完成处理。
使用CXF POJO格式 - Camel Message中的body实际上不是SOAP Message主体,而是它
是org.apache.cxf.message.MessageContentsList;
,其中SOAP Message主体POJO是元素0,如果消息包含更多部分,它们也在那里。
使用javax.xml.validation.Validator
正文POJO必须编组到javax.xml.transform.Source
MyPojoClass bodyObject = ((MessageContentsList) exchange.getIn().getBody()).get(0);
SchemaFactory schemaFactory = SchemaFactory
.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
Schema requestedSchema = schemaFactory.newSchema(schemaUrl);
Validator validator = requestedSchema.newValidator();
// custom handler to collect all errors and warnings
SchemaValidationErrorHandler errHandler = new SchemaValidationErrorHandler();
validator.setErrorHandler(errHandler);
//Custom method convertPojo - uses JAXB Marshaller in standard way
Source xmlSource = convertPojo(bodyObject);
validator.validate(xmlSource);
毕竟,如果错误处理程序收集警告和错误并且不立即抛出异常,则所有错误/警告都将在其中,并且可以根据需要进行处理。
P.S。当Schema对象创建并在某处缓存时,性能会更好。模式对象创建是一项代价高昂的操作。