CXF+SpringBoot webservice
来源:互联网 发布:linux内网通外网不通 编辑:程序博客网 时间:2024/05/01 22:06
CXF+SpringBoot webservice
- CXFSpringBoot webservice
- 简介
- 服务端编写
- 使用jdk自带的工具wsgen生成wsdl和xsd文件不是必要可跳过
- 发布服务端
- 使用jdk wsimport工具生成客户端
- 调用客户端测试
简介
本文源码:https://github.com/zhangchuanben/ws.git
引用地址,这篇文章介绍了一些webservice的基础,以及我们应如何去编写一个webservice。本人也是初学者,如果有不合适的地方还望指正。
写一个webservice有两种方式
wsdl优先,从wsdl文件开始编写,然后生成服务端代码
代码优先,从java代码开始编写,然后生成相应的wsdl文件
wsdl优先比较困难,因为我们必须对wsdl的定义以及xsd文件都比较熟悉,所以本文基于代码优先
服务端编写
package com.ws;import javax.jws.WebMethod;import javax.jws.WebService;import javax.jws.soap.SOAPBinding;import javax.jws.soap.SOAPBinding.ParameterStyle;import javax.jws.soap.SOAPBinding.Style;import javax.jws.soap.SOAPBinding.Use;@WebService(serviceName="OrderProcess", portName="OrderProcessPort", targetNamespace="http://www.ben.com/orderprocess")@SOAPBinding(style=Style.RPC,use=Use.LITERAL, parameterStyle=ParameterStyle.WRAPPED)public class OrderProcessService { @WebMethod public Response processOrder(OrderBean orderBean) { System.out.println("传过来数据:"+orderBean.toString()); Response rs = new Response(); rs.setData("返回数据"); rs.setOrderId("xxxsdfsdfsd"); return rs; }}
这段代码采用JAX-WS声明了一个webservice服务端。但是要注意@SOAPBinding这个注解,它的Style属性有效值为Style.RPC和Style.DOCUMENT,当我选择style=Style.DOCUMENT时,生成客户端是有问题的,生成的客户端方法没有返回值,这显然与我服务端的定义是不符的,但是用SoapUi测试却是能通过的。
还有一点需要注意,@SOAPBinding的parameterStyle属性,它的有效值为ParameterStyle.BARE和ParameterStyle.WRAPPED,当我设置parameterStyle=ParameterStyle.WRAPPED生成客户端时会将入参和返回值进行包装。
使用jdk自带的工具wsgen生成wsdl和xsd文件(不是必要,可跳过)
打开控制台输入:
wsgen
如果正确配置了java的jdk环境应该可以看到类似信息
在编译路径(\target\classes 目录)初打开cmd,输入:
wsgen -cp . com.ws.OrderProcessService -keep -wsdl
ok,你可以在当前目录下看到三个文件:
如果想使用可以将生成的文件复制到资源目录(maven项目下的src/main/resources)
发布服务端
服务端的发布有很多种方法,例如JAX-WS的
public class OrderWebServicePublisher { public static void main(String[] args) { Endpoint.publish("http://localhost:8080/OrderProcessWeb/orderprocess", new OrderProcessService()); }}
而我采用的是springboot+cxf,具体发布代码为:
package com.ws;import javax.xml.ws.Endpoint;import org.apache.cxf.Bus;import org.apache.cxf.jaxws.EndpointImpl;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;@Configurationpublic class WebserviceConfig { @Autowired private Bus bus; @Bean public Endpoint endpoint() { EndpointImpl endpoint = new EndpointImpl(bus, new OrderProcessService()); endpoint.publish("/orderprocess"); return endpoint; }}
因为cxf starter 默认地址为/services/发布的服务名称,所以访问地址为:
http://localhost:8080/services/orderprocess?wsdl
如果想了解更多cxf starter的用法建议参照:
cxf+springboot
如果浏览器显示如下信息,恭喜服务端已经搭建好了。你可以用SoapUi进行测试
使用jdk wsimport工具生成客户端
打开控制台输入:
wsimport
如果正确配置了java的jdk环境应该可以看到类似信息
在编译路径(\target\classes 目录)初打开cmd,输入:
wsimport -d . -p com.ws.client http://localhost:8080/services/orderprocess?wsdl -keep -encoding utf-8
如果在./com/ws/client/目录下看到
则说明生成客户端成功了,将客户端的源文件保存到自己需要的位置
调用客户端测试
package com.ws;import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;import org.junit.Test;import org.junit.runner.RunWith;import org.springframework.boot.test.context.SpringBootTest;import org.springframework.boot.test.context.SpringBootTest.WebEnvironment;import org.springframework.test.context.junit4.SpringRunner;import com.ws.client.OrderBean;import com.ws.client.OrderProcessService;@RunWith(SpringRunner.class)@SpringBootTest(webEnvironment = WebEnvironment.DEFINED_PORT)public class ApplicationTest { @Test public void testClient() { JaxWsProxyFactoryBean soapFactoryBean = new JaxWsProxyFactoryBean(); soapFactoryBean.setAddress("http://localhost:8080/services/orderprocess?wsdl"); soapFactoryBean.setServiceClass(OrderProcessService.class); OrderProcessService service = (OrderProcessService) soapFactoryBean.create(); OrderBean order = new OrderBean(); order.setData("客户端发送数据"); com.ws.client.Response rs = service.processOrder(order); System.out.println(rs.getData()); System.out.println("调用完成"); }}
有一点需要注意如果生成的客户端OrderProcessService.java并不是类似于
package com.ws.client;import javax.jws.WebMethod;import javax.jws.WebParam;import javax.jws.WebResult;import javax.jws.WebService;import javax.jws.soap.SOAPBinding;import javax.xml.bind.annotation.XmlSeeAlso;/** * This class was generated by the JAX-WS RI. * JAX-WS RI 2.2.9-b130926.1035 * Generated source version: 2.2 * */@WebService(name = "OrderProcessService", targetNamespace = "http://www.ben.com/orderprocess")@SOAPBinding(style = SOAPBinding.Style.RPC)@XmlSeeAlso({ ObjectFactory.class})public interface OrderProcessService { /** * * @param arg0 * @return * returns com.ws.client.Response */ @WebMethod @WebResult(partName = "return") public Response processOrder( @WebParam(name = "arg0", partName = "arg0") OrderBean arg0);}
请检查服务端的配置
- CXF+SpringBoot webservice
- springboot整合webService CXF时出错
- springboot下webservice使用cxf jar包报错及解决
- WebService-CXF
- CXF webservice
- CXF WebService
- WebService CXF
- CXF WebService
- CXF WebService
- CXF webservice
- webservice cxf
- cxf webservice
- cxf webservice
- webservice CXF
- webservice cxf
- CXF WebService
- Webservice-CXF
- Cxf webservice
- TCP丶UDP详解
- [POJ 3264] Balanced Lineup (ST表)
- Android关闭开机弹出SIM卡变动提示对话框
- 9.2 GDOI模拟雅礼联考Day1总结
- linux 安装fastdfs
- CXF+SpringBoot webservice
- 原码, 反码, 补码
- bzoj3781(莫队板子)
- Git学习笔记(三) - 分支管理
- 队列的抽象数据类型(abstract data type,ADT)
- PHP函数源码之SESSION实现机制
- BZOJ 1001 狼抓兔子(Dijkstra)
- SIFT算法详解
- 【HDOJ】elevator