如何用Spring Integration DSL实现REST调用SOAP Web Service
Spring Integration Java DSL 实现REST调用SOAP服务方案
你只需要引入spring-integration-ws、spring-integration-http两个模块,就可以完全替换原有XML配置,核心配置逻辑和XML配置一一对应,没有额外迁移成本。
第一步:配置SOAP客户端基础Bean
这些Bean对应XML配置里的ws:message-factory、ws:marshaller、ws:template节点,直接把原有XML里的参数平移到Java配置即可:@Bean public SaajSoapMessageFactory soapMessageFactory() { SaajSoapMessageFactory factory = new SaajSoapMessageFactory(); factory.afterPropertiesSet(); return factory; } @Bean public Jaxb2Marshaller jaxb2Marshaller() { Jaxb2Marshaller marshaller = new Jaxb2Marshaller(); // 替换为wsimport/cxf生成的SOAP实体类所在包路径 marshaller.setContextPath("com.your.project.soap.generated"); return marshaller; } @Bean public WebServiceTemplate webServiceTemplate(SaajSoapMessageFactory soapMessageFactory, Jaxb2Marshaller jaxb2Marshaller) { WebServiceTemplate template = new WebServiceTemplate(soapMessageFactory); // 替换为实际SOAP服务的地址 template.setDefaultUri("http://your-target-soap-service/endpoint"); template.setMarshaller(jaxb2Marshaller); template.setUnmarshaller(jaxb2Marshaller); // 需要配置超时、连接池可以在这里注入自定义HttpComponentsMessageSender return template; }第二步:编写集成流
集成流的逻辑链路和XML里的chain配置完全一致:HTTP入站接收REST请求 -> 参数转换为SOAP请求实体 -> 发起SOAP调用 -> 响应转换为REST格式 -> 返回结果。@Bean public IntegrationFlow restToSoapFlow(WebServiceTemplate webServiceTemplate, Jaxb2Marshaller jaxb2Marshaller) { return IntegrationFlows.from( Http.inboundGateway("/rest/your-api-path") // 替换为自定义REST接口路径 .requestMapping(r -> r.methods(HttpMethod.POST)) // 配置接口允许的请求方法 .requestPayloadType(String.class) // 可替换为自定义REST入参DTO ) // REST入参转SOAP请求实体,根据自己的业务逻辑替换转换规则 .transform(Transformers.converter(source -> { // 示例:REST入参是JSON时,用ObjectMapper转成SOAP对应的JAXB请求对象 // ObjectMapper objectMapper = new ObjectMapper(); // YourSoapRequest soapReq = objectMapper.readValue((String) source, YourSoapRequest.class); // return soapReq; return source; })) // 发起SOAP服务调用 .handle(Ws.outboundGateway(webServiceTemplate) .marshaller(jaxb2Marshaller) .unmarshaller(jaxb2Marshaller) // SOAP服务要求显式传SOAP Action时打开这行,替换为实际Action值 // .soapAction("http://your-soap-service/action/yourMethod") ) // SOAP响应转REST返回格式,根据业务逻辑替换转换规则 .transform(Transformers.converter(source -> { // 示例:把SOAP返回的JAXB实体转成JSON字符串返回 // ObjectMapper objectMapper = new ObjectMapper(); // return objectMapper.writeValueAsString(source); return source; })) .get(); }常用扩展配置
- 超时、连接池配置:给
WebServiceTemplate注入HttpComponentsMessageSender,可以配置连接超时、读取超时、最大连接数等参数,和XML里配置messageSender的逻辑一致 - 鉴权、请求头追加:可以给
WebServiceTemplate添加自定义ClientInterceptor,统一处理SOAP请求头、签名、鉴权逻辑,也可以在流调用SOAP前通过header enricher追加动态请求头 - 日志打印:给
WebServiceTemplate添加SoapEnvelopeLoggingInterceptor可以打印完整SOAP报文,也可以在流中加log()节点打印各阶段的消息内容 - 异常处理:在流中配置错误通道,捕获SOAP调用抛出的异常,转换为REST接口统一的错误响应格式,避免把SOAP的原始错误信息直接透传给调用方
- 超时、连接池配置:给
如果你之前用的是字符串报文模式(不使用JAXB序列化,直接拼接XML字符串传参),只需要去掉
Ws.outboundGateway()的marshaller相关配置,直接传入SOAP服务地址,前置转换器输出拼接好的XML字符串即可,不需要额外调整逻辑。
内容的提问来源于stack exchange,提问作者Somnath Mukherjee
相关产品推荐
相关产品推荐

