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

Spring Boot中SOAP Response转JSON:求非节点遍历的框架方案

Spring Boot中SOAP响应转REST风格JSON的Spring内置实现方案

方案1:Spring OXM(JAXB)+ Jackson 对象映射

这是最常用的Spring原生方案,通过XML-对象映射将SOAP响应转为Java实体,再转JSON,完全无需手动遍历XML节点。

步骤:

  1. 生成/定义SOAP响应对应的Java实体类

    • 可通过wsimport工具从SOAP接口的WSDL自动生成带JAXB注解的实体类,或手动为实体类添加@XmlRootElement、@XmlElement等JAXB注解,指定XML节点与类属性的映射关系。
    • 示例实体类:
      @XmlRootElement(name = "SoapResponse", namespace = "http://example.com/soap/service")
      public class SoapResponse {
          @XmlElement(name = "userId")
          private String userId;
          @XmlElement(name = "userName")
          private String userName;
          // getter/setter
      }
      
  2. 配置Jaxb2Marshaller Bean
    Spring提供的Jaxb2Marshaller是OXM模块的核心实现,用于XML与Java对象的双向转换:

    @Configuration
    public class SoapConfig {
        @Bean
        public Jaxb2Marshaller jaxb2Marshaller() {
            Jaxb2Marshaller marshaller = new Jaxb2Marshaller();
            // 指定实体类所在包路径
            marshaller.setContextPath("com.example.soap.model");
            // 配置命名空间映射(解决SOAP命名空间冲突)
            Map<String, String> namespaceMappings = new HashMap<>();
            namespaceMappings.put("http://example.com/soap/service", "ns");
            marshaller.setNamespaceMappings(namespaceMappings);
            return marshaller;
        }
    
        @Bean
        public WebServiceTemplate webServiceTemplate(Jaxb2Marshaller jaxb2Marshaller) {
            WebServiceTemplate template = new WebServiceTemplate();
            template.setMarshaller(jaxb2Marshaller);
            template.setUnmarshaller(jaxb2Marshaller);
            // 设置SOAP接口地址
            template.setDefaultUri("http://example.com/soap/service");
            return template;
        }
    }
    
  3. 调用SOAP接口并转换为JSON
    借助配置好的WebServiceTemplate,直接获取Java实体对象,再通过Spring默认集成的JacksonObjectMapper转为JSON:

    @Service
    public class SoapToRestService {
        @Autowired
        private WebServiceTemplate webServiceTemplate;
        @Autowired
        private ObjectMapper objectMapper;
    
        public String getRestStyleJsonResponse() {
            // 构造SOAP请求对象
            SoapRequest request = new SoapRequest();
            request.setUserId("123");
    
            // 调用SOAP接口,直接返回Java实体
            SoapResponse soapResponse = (SoapResponse) webServiceTemplate.marshalSendAndReceive(request);
    
            // 转换为REST风格JSON
            try {
                return objectMapper.writeValueAsString(soapResponse);
            } catch (JsonProcessingException e) {
                throw new RuntimeException("转换JSON失败", e);
            }
        }
    }
    

方案2:Jackson XML模块直接转换XML到JSON

利用Jackson的jackson-dataformat-xml模块(Spring Boot Web Starter默认集成),跳过Java实体直接将SOAP XML转为JSON,或先转为JsonNode再处理。

实现示例:

@Service
public class SoapXmlToJsonService {
    public String convertSoapXmlToJson(String soapXml) throws JsonProcessingException {
        XmlMapper xmlMapper = new XmlMapper();
        // 忽略未知属性,避免SOAP Envelope/Body节点干扰
        xmlMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
        
        // 解析SOAP XML为JsonNode,提取Body内的响应节点
        JsonNode rootNode = xmlMapper.readTree(soapXml);
        JsonNode responseNode = rootNode.path("Body").path("SoapResponse");

        // 转换为JSON字符串
        ObjectMapper objectMapper = new ObjectMapper();
        return objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(responseNode);
    }
}

注:若需要更精准的节点映射,可结合@JsonRootName注解自定义实体类,用XmlMapper直接将XML转为实体后再转JSON。

方案3:Spring MessageConverter 统一处理

通过Spring的MappingJackson2XmlHttpMessageConverter和MappingJackson2HttpMessageConverter实现自动转换,适用于REST接口直接返回SOAP转换后的JSON场景:

配置MessageConverter:

@Configuration
public class WebConfig implements WebMvcConfigurer {
    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        // XML转对象的Converter
        MappingJackson2XmlHttpMessageConverter xmlConverter = new MappingJackson2XmlHttpMessageConverter();
        xmlConverter.setObjectMapper(new XmlMapper());
        converters.add(xmlConverter);

        // 对象转JSON的Converter
        MappingJackson2HttpMessageConverter jsonConverter = new MappingJackson2HttpMessageConverter();
        converters.add(jsonConverter);
    }
}

使用方式:

在REST接口中,直接将SOAP响应的Java实体作为返回值,Spring会自动转为JSON输出:

@RestController
@RequestMapping("/api")
public class RestController {
    @Autowired
    private SoapToRestService soapService;

    @GetMapping("/user")
    public SoapResponse getUserInfo() {
        // 调用SOAP接口获取实体
        return (SoapResponse) soapService.webServiceTemplate.marshalSendAndReceive(new SoapRequest());
    }
}

内容的提问来源于stack exchange,提问作者BALA AP

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 00:50:35