You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 17:03:19