Spring Boot集成Apache CXF同时支持JaxWS SOAP与JaxRS REST服务问题咨询
问题1:同一项目可以同时使用Apache CXF实现RS和WS两类服务
你当前启动故障的核心原因是两类服务的路径冲突,加上手动配置和starter自动配置存在重叠,按以下步骤修改即可正常运行:
步骤1:修复路径冲突
你目前SOAP服务发布路径为/student,RS服务根路径设置为/,而RS接口的路径也是/student开头,CXF的Servlet无法区分同前缀的两类请求,直接触发冲突。
修改配置类中RS服务的根地址,增加单独前缀即可:
@Bean public Server rsServer() { JAXRSServerFactoryBean endpoint = new JAXRSServerFactoryBean(); endpoint.setBus(bus); // 给RS服务单独设置根前缀,避免和SOAP路径冲突 endpoint.setAddress("/api"); endpoint.setServiceBeans(Arrays.asList(myRestService)); endpoint.setProvider(new JacksonJaxbJsonProvider()); return endpoint.create(); }
修改后两类服务的访问路径完全隔离:
- SOAP服务路径:
{cxf.path}/student即/service/student - RS服务路径:
{cxf.path}/api/student/get即/service/api/student/get
步骤2(可选):用starter自动配置简化代码
如果不想手动编写RS服务的注册Bean,可以直接删除配置类中的rsServer方法,修改application.properties配置即可实现自动注册:
cxf.path=/service cxf.jaxrs.component-scan=true cxf.jaxrs.classes-scan-packages=com.example.rest # 给RS服务设置单独根前缀 cxf.jaxrs.address=/api
问题2:使用Spring Boot原生REST实现方案更简便,且和CXF SOAP服务完全兼容
该方案不需要额外依赖CXF的RS starter,也不会出现路径冲突问题,配置成本更低,修改步骤如下:
步骤1:调整依赖
删除cxf-spring-boot-starter-jaxrs依赖,仅保留jaxws的starter即可。
步骤2:改造原有RS服务代码
将JAX-RS注解替换为Spring MVC原生注解:
package com.example.rest; import com.example.domain.Student; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController @RequestMapping("/student") public class MyRestService { @GetMapping("/get") public Student getStudent() { return new Student("Saifur", "Rahman", "061240"); } }
步骤3:清理多余配置
删除配置类中的rsServer方法以及properties中所有和jaxrs相关的配置,原有SOAP服务的配置完全不需要改动。
修改后两类服务完全走独立的Servlet处理,互不影响:
- SOAP服务路径:
/service/student(走CXF Servlet) - 原生REST路径:
/student/get(走Spring MVC DispatcherServlet)
内容的提问来源于stack exchange,提问作者Saifur
相关产品推荐
相关产品推荐

