一、搭建WebService服务端
搭建webservice服务端一般有两种情况
1.1 从0搭建webService服务端
首先引入jar包
<!--cxf--> <!-- https://mvnrepository.com/artifact/org.apache.cxf/cxf-rt-frontend-jaxws --> <dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-rt-frontend-jaxws</artifactId> <version>3.1.6</version> </dependency> <!-- https://mvnrepository.com/artifact/org.apache.cxf/cxf-core --> <dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-core</artifactId> <version>3.1.6</version> </dependency> <!-- https://mvnrepository.com/artifact/org.apache.cxf/cxf-rt-transports-http --> <dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-rt-transports-http</artifactId> <version>3.1.6</version> </dependency>
然后新建service,这里就面向接口了,直接新建一个calss类
package cn.wanghao.server; import javax.jws.WebService; @WebService public class HelloWordWebServie { public String say(String parm1,int parm2){ System.out.println("测试测试"+parm1); return "测试"; } }
然后定义Servlet,拦截webservice开头的请求
<!--定义一个cxf的servlet--> <servlet> <servlet-name>CXFServlet</servlet-name> <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>CXFServlet</servlet-name> <url-pattern>/webservice/*</url-pattern> </servlet-mapping>
然后把我们的webservice类教给Spring管理
<import resource="classpath:META-INF/cxf/cxf.xml"/> <import resource="classpath:META-INF/cxf/cxf-servlet.xml"/> <bean id="hello" class="cn.wanghao.server.HelloWordWebServie" /> <jaxws:endpoint id="helloWorld" implementor="#hello" address="/HelloWorld" /> <!-- <jaxws:endpoint id="helloWorld" implementor="cn.wanghao.server.HelloWordWebServie" address="/HelloWorld"/>-->
如果引入上面的需要增加约束
xmlns:jaxws="http://cxf.apache.org/jaxws"
......
http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd">
然后访问:http://localhost:8080/webservice 可以看到我们已经发布成功,点击url链接可以看到wsdl内容。
可以看到成功了,但是我们的参数名称是arg0,看起来很难阅读,我们可以修改参数名称。不建议用中文,此处测试用
重启tomcat后访问如下:
注:我们把这个wsdl内容保存下来,取名后后缀为.wsdl,下面会用到
1.1 根据wsdl生成服务端
由于我没有系统学过,所以对webService了解的也不是很多,粗略理解webService就是根据这个wsdl规范的请求和访问。
所以可能业务需求需要你根据wsdl生成服务端供其他人调用。所以就会给你一个wsdl,你依据wsdl写服务端。
开始了,首先把之前保存的wsdl文件复制到项目下面,如下:
点击确定生成服务端代码,还在当前目录下,可能名字不一样,但是文件差不多
然后重写实现类:
package cn.wanghao.server.test; public class HelloWordWebServieServiceSoapBindingImpl implements cn.wanghao.server.test.HelloWordWebServie{ public java.lang.String say(java.lang.String desc, int status) throws java.rmi.RemoteException { return "你的参数为: desc "+desc+" status:" +status; } }
注:这里不止生成了这几个文件。还会生成一个server-config.wsdd 该文件与web.xml同级,以及web.xml多了很多代码如下:
报错是因为缺少jar包,我们依赖第三方包即可:
<!-- https://mvnrepository.com/artifact/org.apache.axis/axis --> <dependency> <groupId>org.apache.axis</groupId> <artifactId>axis</artifactId> <version>1.4</version> </dependency>
不报错之后,我们拷贝deploy.wsdd 里面的service到server-config.wsdd 与里面的service标签同级即可
service的名字可以自己修改,
然后启动项目提示少包,依次根据报错引入这两个包,然后启动OK,
<!-- https://mvnrepository.com/artifact/org.apache.axis/axis-jaxrpc --> <dependency> <groupId>org.apache.axis</groupId> <artifactId>axis-jaxrpc</artifactId> <version>1.4</version> </dependency> <!-- https://mvnrepository.com/artifact/commons-discovery/commons-discovery --> <dependency> <groupId>commons-discovery</groupId> <artifactId>commons-discovery</artifactId> <version>0.2</version> </dependency>
访问项目:http://localhost:8080/services
前面的是自带的,最下面的是我自己的,多余的暴露接口也可以删除,然后点击我们接口进去后跟上面的一样
然后保存好这个wsdl,下面会用到
二、使用wsdl编写客户端
其实webService客户端调用直接main方法就可以调用,不用启服务,所以上面的项目不用关闭,另外启动项目进行调用。jar包以及引入好了。
注意不要有用中文,之前的中文只是测试使用,这里需要规范属性名称
这里生产客户端
生成结构如下:
调用main方法如下:
package example.other; import cn.wanghao.server.test.HelloWordWebServieServiceLocator; import javax.xml.rpc.ServiceException; import java.rmi.RemoteException; public class HelloCallWebServiceTest { public static void main(String[] args) throws ServiceException, RemoteException { HelloWordWebServieServiceLocator locator = new HelloWordWebServieServiceLocator(); // 设置webService调用地址,可以写在生成类里面 // locator.setHelloWordWebServiePortEndpointAddress("http://localhost:8080/services/HelloWordWebServiePort?wsdl"); String result = locator.getHelloWordWebServiePort().say("测试参数", 1); System.out.println("HelloCallWebServiceTest 返回参数为:"+result); } }
执行后返回,与我们的的webServicce 实现对应
这里就不测试第一种方法了,以上就是spring集成webService并互相调用,有问题可以留言讨论。
参考文章:
https://blog.csdn.net/fhliuzhihu/article/details/78115828
https://blog.csdn.net/zty1317313805/article/details/80254751
http://cxf.apache.org/docs/writing-a-service-with-spring.html