Spring集成WebService


一、搭建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

https://blog.csdn.net/zhuo889/article/details/80575493


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM