SpringBoot集成WebService
SpringBoot集成WebService
1.引入pom依赖
<dependencies><!-- 引入Spring Boot Web Starter --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- 引入Spring Boot Web Services Starter --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web-services</artifactId></dependency><!-- 引入Apache CXF Spring Boot Starter for JAX-WS --><dependency><groupId>org.apache.cxf</groupId><artifactId>cxf-spring-boot-starter-jaxws</artifactId><version>3.3.0</version></dependency><dependency><groupId>axis</groupId><artifactId>axis</artifactId><version>1.4</version></dependency><dependency><groupId>org.dom4j</groupId><artifactId>dom4j</artifactId><version>2.1.4</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-logging</artifactId></dependency><!-- 引入Spring Boot Test Starter --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies>
2.配置webservice
@Configuration
@ConditionalOnClass(CXFServlet.class)
public class WebServiceConfig {@Autowiredprivate TestService testService;@Value("${spring.webservices.path}")private String path;/*** 自动注入Spring Bus实例,它是CXF的核心组件之一,用于管理和配置CXF运行时环境。*/@Autowiredprivate SpringBus bus;/*** 创建并返回Webservice端点(Endpoint)实例,用于发布MyWebService服务。* 将服务实现类与Spring Bus关联,并指定发布地址为"/tax"。** @return Webservice端点实例*/@Beanpublic Endpoint endpoint() {EndpointImpl endpoint = new EndpointImpl(bus, testService);endpoint.publish("/test"); // 发布地址return endpoint;}/*** 创建并返回CXF Servlet的ServletRegistrationBean实例,用于注册CXF Servlet到Spring Boot的Servlet容器中。* 设置CXF Servlet的映射路径为"/services/*",表示所有以"/services/"开头的HTTP请求都将由CXF Servlet处理。** @return CXF Servlet的ServletRegistrationBean实例*/@Beanpublic ServletRegistrationBean wsServlet() {return new ServletRegistrationBean(new CXFServlet(), path+"/*");}
}
3. 编写WebService服务
@WebService(name = "testService",targetNamespace = "http://www.test.com")
public interface TestService{/*** 推送信息* @param xml* @return xml*/@WebMethod(operationName = "pushTest")@WebResult(name = "xml") String pushTest(@WebParam(name="bwlx")String bwlx,@WebParam(name="xml") String xml);/*** 接收返回信息* @param xml* @return xml*/@WebMethod(operationName = "receiveTaxFee")@WebResult(name = "xml") String receiveTaxFee(@WebParam(name="xml") String xml);
}@Service
@WebService(name = "testService",targetNamespace = "http://www.test.com",
endpointInterface = "com.test.webservice.service.TestService")
public class TestServiceImpl implements TestService{private Logger logger = LoggerFactory.getLogger(TaxServiceImpl.class.getName());@Autowiredprivate Environment environment;@Value("${tax.department.url}")private String url;@Value("${tax.department.nameSpace}")private String nameSpace;@Value("${tax.department.method}")private String method;@Overridepublic String pushTaxFee(String bwlx,String xml) {return sendXML(url,nameSpace,method,xml,bwlx);}@Overridepublic String receiveTest(String srcXML) {//返回logger.info("testreceive request:" + srcXML);String xml="";try {//解析报文Map<String, Object> param = parseXml(srcXML);//机构标识String jgbs =param.get("JGBS").toString();String url = environment.getProperty("district."+jgbs+".url");String nameSpace = environment.getProperty("district."+jgbs+".nameSpace");String method = environment.getProperty("district."+jgbs+".method");//转发报文return sendXML(url,nameSpace,method,srcXML,"");//返回} catch (DocumentException e) {throw new RuntimeException(e);}}/*** 推送报文* @param url 地址* @param method 方法名* @param xml 请求xml* @param bwlx 第一个参数* @return*/private String sendXML(String url,String nameSpace,String method,String xml,String bwlx) {try {logger.info("push url:" + url);logger.info("push method:" + method);logger.info("push start:");logger.info("send bwlx:" + bwlx);logger.info("send xml:" + xml);org.apache.axis.client.Service service = new org.apache.axis.client.Service();Call call = (Call) service.createCall();call.setTargetEndpointAddress(new URL(url));call.setOperationName(new QName(nameSpace, method));//Client client = JaxWsDynamicClientFactory.newInstance().createClient(url);Object[] args = !StringUtils.isEmpty(bwlx)?new Object[]{bwlx, xml}:new Object[]{xml};/*Object[] retObject = client.invoke(new QName(nameSpace, method), args);for(Object object : retObject){logger.info("返回数据:" + object.toString());}logger.info("result:" + retObject);*/String resultXml = (String) call.invoke(args);logger.info("result:" + resultXml);logger.info("end");//return retObject[0].toString();return resultXml;} catch (Exception e) {logger.error("请求发生错误:", e);if (e instanceof ConnectException) {return "接口连接超时,请联系管理员!";}return e.getMessage();}}
注意事项
webservice发送请求有以下方式,推荐方法2:
方法1
Client client = JaxWsDynamicClientFactory.newInstance().createClient(url);
Object[] args = !StringUtils.isEmpty(bwlx)?new Object[]{bwlx, xml}:new Object[]{xml};
Object[] retObject = client.invoke(new QName(nameSpace, method), args);
方法2
Call call = (Call) service.createCall();call.setTargetEndpointAddress(new URL(url));call.setOperationName(new QName(nameSpace, method));Object[] args = !StringUtils.isEmpty(bwlx)?new Object[]{bwlx, xml}:new Object[]{xml};String resultXml = (String) call.invoke(args);
两种方法都可以发送请求,在实际使用中发现方法一种的请求url 如果被转发代理,发送请求时发现实际请求为代理前的地址,会导致无法访问转发后的地址。
4.配置properties
server.port=8090
spring.webservices.path=/services
5.启动应用访问
http:localhost:8090/services/test?wsdl