webservice的简单入门(附demo下载)

webservice入门

官方文档:
http://cxf.apache.org/docs/springboot.html
apache官方示例springboot-cxf-webservice:
https://github.com/apache/cxf/tree/master/distribution/src/main/release/samples/jaxws_spring_boot

  • 是什么?

  • WebService采用的是http的soap协议,用来专门用来进行数据交互的,协议的目的就是起到一种规范,他在开发是需要开发人员去专门学习他的语法规范,看起来让开发更加麻烦。但是他的好处也是很多,会在下面进行体现。

  • 怎么做?

  • 它的组成由服务端和客户端两部门组成,服务端负责提供服务,客户端负责使用服务。

  • 那么我们首先进行服务端的开发

  • 服务端

  • 引入依赖

  • 这些需要注意的是cxf依赖的版本和springboot不能相差太大,不然容易版本冲突报错

  •   <!-- CXF webservice -->
          <dependency>
              <groupId>org.apache.cxf</groupId>
              <artifactId>cxf-spring-boot-starter-jaxws</artifactId>
              <version>3.4.5</version>
          </dependency>
    

标注:

1.@WebService

里面方法的含义:

​ 1、servceName=“XXX” //对外发布的服务名

​ 2、targetNamespace=“http://XXX.com” //指定你想要的名称空间,通常使用使用包名反转

​ 3、endpointInterface=“com.XXX.xxService” 服务接口全路径,不是实现类的路径

注:接口写1和2注释即可。实现类1、2、3都写,且3的服务路径指向接口(而不是实现类自己,不然会报找不到方法。特别是接口和实现类不在同一个文件夹,一般实现类都在接口的下一层impl文件夹下)

我们demo中直接全部默认,不写。正式接口最好还是写

2.@WebMethod

该方法为webservice暴露的方法,用于向外公布,它修饰的方法是webservice方法,去掉也没影响的,类似一个注释信息

程序开始:

  • 和正常的定义服务一样,我们需要定义一个服务接口,里面定义方法,同时我们需要写一个实现类去实现这个接口和里面的方法。唯一的区别就是它需要在接口和方法上注解@WebService和@WebMethod,例如:(此注解在JDK1.6及其以后版本才支持)

配置文件application.yml添加-

# cxf webservice  webservice接口统一路径前缀,所有的webservice接口都回多着一层访问路径
cxf:
  path: /demo

代码:

 import javax.jws.WebMethod;
 import javax.jws.WebService;
 
 /**
  * 这是webService的接口
  */
 @WebService
 public interface WSService {
   @WebMethod
   public String sayHello(String name);
 }
 
 
 -------------------------它的实现类--------------------
 import com.example.service.WSService;
 
 import javax.jws.WebService;
 @WebService
 @Component  // 注入spring里面,省的我们自己一个个new,而且可以使用@Validated+@Valid进行参数校验
 public class WSServiceImpl implements WSService {
   @Override
   public String sayHello(String name) {
     return  return name+" hello,welcome to our first webService ";
   }
 }
 

定义完了服务之后,我们肯定是需要把服务进行发布的,不然别人怎么调用呢,可以配置一个类进行启动,如下:

import com.example.service.WSService;
import com.example.service.impl.WSServiceImpl;
import org.apache.cxf.Bus;
import org.apache.cxf.bus.spring.SpringBus;
import org.apache.cxf.jaxws.EndpointImpl;
import org.apache.cxf.transport.servlet.CXFServlet;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import javax.xml.ws.Endpoint;
/** * 配置并发布webService */
@Configuration
public class WSConfig {  
   
    @Autowired
 	private Bus bus;
  
 	 @Resource
 	 WSService  demoService;

    /**   *用Endpoint发布服务   * @return   */ 
    @Bean  
    public Endpoint endpoint() {    
        EndpointImpl endpoint = new EndpointImpl(bus, demoService);    			
        endpoint.publish("/api");    
        return endpoint;  
    }
}

然后直接启动springboot的启动类,在浏览器中输入:http://localhost:8090/demo

得要下面页面,这里如果定义了多个的话可以查看所有demo下面的webService服务,这只有一个。

在这里插入图片描述

输入:http://localhost:8090/demo/api?wsdl 得要一下页面

在这里插入图片描述

当然也可以在启动类中直接发布服务,如下,两种办法看自己选择哪种

import javax.xml.ws.Endpoint;
@SpringBootApplication
public class DemoApplication {  
    public static void main(String[] args) {    SpringApplication.run(DemoApplication.class, args);    
   //下面是作为发布服务的   
 String address = "http://127.0.0.1:8090/Webservice";  
                                            
//使用Endpoint类提供的publish方法发布WebService,发布时要保证使用的端口号没有被其他应用程序占用,访问时需要在路劲后面加上wsdl,这个方位就直接是http://127.0.0.1:8090/Webservice?wsdl
Endpoint.publish(address , new WSServiceImpl());    
System.out.println("发布webservice成功!");  
}
}

客户端:

  • 这个时候就体现我们遵守协议的好处了,我们得要上面服务端提供的访问地址后,就可以根据他的地址http://localhost:8090/demo/api?wsdl 直接生成我们需要的代码,前提是服务端要开启服务,如下步骤:

  • 创建一个springboot项目,
    -在这里插入图片描述
    注意选择协议,然后分别选择填入地址和选择包路径即可 http://localhost:8090/demo/api?wsdl
    在这里插入图片描述

  • 图上标记为1地方填写我们发布的服务地址http://localhost:8090/demo/api?wsdl

  • 图上标记为2地方填写生成代码的路径,点击OK 就能自动生遵循soap协议的本地址的代码,下图中除了springboot的启动类外都是自动生成的。

  • 注意:这里JDK1.8自动生成代码可能会报错

  • 解决方法:
    在jdk的安装路径下,%JAVA_HOME%\jre\lib,添加一个属性文件jaxp.properties,并写上如下内容javax.xml.accessExternalSchema = all

在这里插入图片描述

  • 接下来把上面的生成的代码引入到我们的项目之中,直接当成本地Java类进行使用。

注意:如果用IDEA生成webservice客户端代码不方便的话直接用JDK也可以
方法是:在一个新文件夹里打开cmd命令符,输入

wsimport  -keep http://localhost:8090/demo/api?wsdl

其语法为:

wsimport的用法
wsimport [options] <WSDL_URI>
比较常用的[options]有:
1. -d <directory>
   在指定的目录生成class文件
2. -clientjar <jarfile>
   在当前目录生成jar文件,结合-d <directory>可以在指定的目录生成jar文件
3. -s <directory>
   在指定的目录生成java源文件
4. -p <pkg>
   指定生成文件的包结构
5. -keep
   在生成class文件,或者jar包时,同时保留java源文件

也能生成代码,把生成的代码复制到你客户端里就行
(其本意就是调用JDK里面的wsimport.exe程序,如果提示报错wsimport不是命令,解决方法
https://blog.csdn.net/qiaodaima0/article/details/104800393)

  • 直接调用WSServiceImplService提供的webService接口,我们直接在在测试单元中调用

  • import com.example.WSServiceImplService;
    import org.junit.Test;
    import org.junit.runner.RunWith;
    import org.springframework.boot.test.context.SpringBootTest;
    import	org.springframework.test.context.junit4.SpringRunner;
    
    @RunWith(SpringRunner.class)
    @SpringBootTest
    public class DemoApplicationTests {  
    @Test  public void contextLoads() {    
        
    WSServiceImplService wsServiceImplService=new WSServiceImplService();    
    String result = wsServiceImplService.getWSServiceImplPort().sayHello("xiaoPeng"); 
    System.out.println("========================================");    			      	System.out.println(result);   	 						      	System.out.println("========================================");  
    	}
    }
    
  • 启动后结果显示:

在这里插入图片描述

  • 那么这一个完成的服务端发布服务—>客户端调用服务 的简单demo就已经完成了。

demo下载链接:
链接:https://pan.baidu.com/s/1vAZsgDi6DQKsj9p7Wv51VA
提取码:505a

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值