Spring Boot中SOAP Response转JSON:求非节点遍历的框架方案
Spring Boot中SOAP响应转REST风格JSON的Spring内置实现方案
方案1:Spring OXM(JAXB)+ Jackson 对象映射
这是最常用的Spring原生方案,通过XML-对象映射将SOAP响应转为Java实体,再转JSON,完全无需手动遍历XML节点。
步骤:
生成/定义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 }
- 可通过
配置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; } }调用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
相关产品推荐
相关产品推荐

