基于Camel-CXF组件的SOAP服务Schema验证及自定义消息需求
刚好之前做过Camel-CXF下的SOAP服务Schema验证+自定义错误返回的需求,给你梳理下具体实现步骤:
实现Camel-CXF SOAP服务的Schema验证及自定义错误返回
1. 开启SOAP请求的Schema验证
首先要让Camel-CXF启用Schema校验,这里分两种常用配置方式:
方式一:Java DSL配置
如果用Java代码编写路由,可以直接在CXF端点或数据格式中开启验证:
// 方式A:通过marshal组件开启验证 from("cxf:bean:mySoapEndpoint") .marshal().soapjaxb().schemaValidation(true) .to("bean:myServiceBean"); // 方式B:直接配置CXFEndpoint CXFEndpoint endpoint = new CXFEndpoint(); endpoint.setAddress("/mySoapService"); endpoint.setServiceClass(MyService.class); endpoint.setSchemaValidation(true); // 开启Schema验证
方式二:Spring XML配置
如果是Spring环境,在<cxf:cxfEndpoint>标签中添加验证属性:
<cxf:cxfEndpoint id="mySoapEndpoint" address="/mySoapService" serviceClass="com.example.MyService"> <cxf:properties> <entry key="schema-validation-enabled" value="true"/> </cxf:properties> </cxf:cxfEndpoint>
2. 捕获验证异常并返回自定义SOAP Fault
当Schema验证失败时,CXF会抛出org.apache.cxf.interceptor.SchemaValidationException,我们需要用Camel的onException机制捕获这个异常,替换成自定义的错误响应。
步骤1:编写自定义Fault处理器
先创建一个处理器,用来构造符合业务需求的SOAP错误消息:
public class CustomValidationFaultProcessor implements Processor { @Override public void process(Exchange exchange) throws Exception { // 获取捕获到的验证异常 SchemaValidationException validationEx = exchange.getProperty(Exchange.EXCEPTION_CAUGHT, SchemaValidationException.class); // 组装自定义错误信息 String errorMsg = "请求参数不符合Schema规范:" + validationEx.getMessage(); // 构造SOAP Fault对象 SoapFault customFault = new SoapFault(errorMsg, FaultCode.CLIENT); // 可选:添加自定义错误详情 String detailXml = String.format("<customError><code>INVALID_SCHEMA</code><msg>%s</msg></customError>", errorMsg); customFault.setDetail(new StreamSource(new StringReader(detailXml))); // 设置响应为Fault exchange.getOut().setFault(true); exchange.getOut().setBody(customFault); } }
步骤2:在路由中绑定异常处理
把上面的处理器绑定到路由的异常拦截逻辑中:
// 拦截Schema验证异常,使用自定义处理器返回错误 onException(SchemaValidationException.class) .handled(true) // 标记异常已处理,不再走默认错误逻辑 .process(new CustomValidationFaultProcessor()); // 业务路由 from("cxf:bean:mySoapEndpoint") .marshal().soapjaxb().schemaValidation(true) .to("bean:myServiceBean");
如果是Spring XML配置,对应写法如下:
<camelContext xmlns="http://camel.apache.org/schema/spring"> <!-- 异常拦截配置 --> <onException> <exception>org.apache.cxf.interceptor.SchemaValidationException</exception> <handled><constant>true</constant></handled> <process ref="customValidationFaultProcessor"/> </onException> <!-- 业务路由 --> <route> <from uri="cxf:bean:mySoapEndpoint"/> <marshal><soapjaxb schemaValidation="true"/></marshal> <to uri="bean:myServiceBean"/> </route> </camelContext> <!-- 注册自定义处理器 --> <bean id="customValidationFaultProcessor" class="com.example.CustomValidationFaultProcessor"/>
3. 关键注意事项
- 确保你的WSDL文件已经正确引用了对应的XSD Schema,否则验证时会因找不到Schema文件报错。
- 必须设置
handled(true),否则Camel会继续使用默认的异常响应逻辑,覆盖你的自定义错误。 - 如果需要更细致的错误信息,可以通过
validationEx.getValidationErrors()获取所有验证失败的具体点位,再组装到自定义Fault中。
内容的提问来源于stack exchange,提问作者Snehal Kulkarni
相关产品推荐
相关产品推荐

