SpringBoot整合WebService服务的实现代码

作者:湮顾千古 时间:2021-11-11 14:59:11 

WebService是一个SOA(面向服务的编程)的架构,它是不依赖于语言,不依赖于平台,可以实现不同的语言间的相互调用,通过Internet进行基于Http协议的网络应用间的交互。 其实WebService并不是什么神秘的东西,它就是一个可以远程调用的类,或者说是组件,把你本地的功能开放出去共别人调用。

为什么使用WebService?

简单解释一下WebService,比如你的项目需要查询某银行账户余额。你能直接查吗,肯定不行,因为数据库是银行的,他不可能给你权限。你想访问他的数据库获取数据,这就需要用到WebService。通过调用银行暴露的接口来得到你想要的数据。

适用场景: 

软件的集成和复用,如气象局(服务端系统)、天气查询网站等。

  • 发布一个服务(对内/对外),不考虑客户端类型,不考虑性能,建议WebService

  • 服务端已经确定使用webservice,客户端不能选择,必须使用WebService

软件集成:通过远程调用技术,将两个系统整合到一起,从而实现软件集成。

软件复用:同一个款软件的多次集成,最终实现复用。

不适用场景:

  • 考虑性能时不建议使用WebService

  • 同构程序下不建议使用WebService

Axis2与CXF的区别

目前java开发WebService的框架主要包括Axis2和CXF,如果你需要多语言的支持,你应该选择Axis2。如果你需要把你的实现侧重java并希望和Spring集成,CXF就是更好的选择,特别是把你的WebService嵌入其他的程序中。

区别Axis2CXF
简述WebService引擎简易的SOA框架,可以作为ESB
spring集成不支持支持
应用集成困难简单
是否跨语言
部署方式web应用嵌入式
服务的管控和治理支持不支持

SpringBoot使用CXF集成WebService

1.向pom.xml中添加集成WebService的相关依赖

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web-services</artifactId>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-frontend-jaxws</artifactId>
<version>3.1.6</version>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-transports-http</artifactId>
<version>3.1.6</version>
</dependency>

2.创建服务端接口

package com.primeton.mq.service;

import javax.jws.WebService;
@WebService(name = "DemoService", // 暴露服务名称
   targetNamespace = "http://service.mq.primeton.com"// 命名空间,一般是接口的包名倒序
)
public interface DemoService {
   public String sayHello(String user);
}

3.创建服务端接口实现类

package com.primeton.mq.service.impl;

import com.primeton.mq.service.DemoService;
import javax.jws.WebService;
import java.util.Date;
@WebService(serviceName = "DemoService", // 与接口中指定的name一致
       targetNamespace = "http://service.mq.primeton.com", // 与接口中的命名空间一致,一般是接口的包名倒
       endpointInterface = "com.primeton.mq.service.DemoService"// 接口地址
)
public class DemoServiceImpl implements DemoService {
   @Override
   public String sayHello(String user) {
       return user+",现在时间:"+"("+new Date()+")";
   }
}

4.创建CXF配置类

package com.primeton.mq.webServiceConfig;

import com.primeton.mq.service.DemoService;
import com.primeton.mq.service.impl.DemoServiceImpl;
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;
@Configuration
public class CxfConfig {
   @Bean
   public ServletRegistrationBean dispatcherServlet() {
       return new ServletRegistrationBean(new CXFServlet(),"/demo/*");
   }
   @Bean(name = Bus.DEFAULT_BUS_ID)
   public SpringBus springBus() {
       return new SpringBus();
   public DemoService demoService() {
       return new DemoServiceImpl();
   public Endpoint endpoint() {
       EndpointImpl endpoint = new EndpointImpl(springBus(), demoService());
       endpoint.publish("/api");
       return endpoint;
}

5.启动SpringBoot服务

输入http://localhost:8090/demo/api?wsdl即可,注意我设置的端口是8090,视情况而定。

SpringBoot整合WebService服务的实现代码

6.创建客户端

在idea中进入File > New Project&hellip;菜单打开新建项目窗口,依次选择Java、WebServices,Version项选择Apache Axis,Libraries项选择 Download。然后点击Next按钮进入下一页。

SpringBoot整合WebService服务的实现代码

在下一页中输入项目名称,然后点击Finish按钮开始下载依赖包。依赖包下载完成后进入新建的项目。

SpringBoot整合WebService服务的实现代码

选WebServices > Generate Wsdl From Java Code,生成wsdl

SpringBoot整合WebService服务的实现代码

然后选择服务地址

SpringBoot整合WebService服务的实现代码

确定之后,创建一个测试类,代码如下:

package test;

import example.DemoServiceImplService;
public class demo {
   public static void main(String[] args) {
       DemoServiceImplService webServiceImpl = new DemoServiceImplService();
       String result = webServiceImpl.getDemoServiceImplPort().sayHello("没有说");
       System.out.println("===========================================");
       System.out.println(result);
   }
}

注意:实现WebService客户端不一定要生成客户端的代码,可以通过地址动态调用。

package com.primeton.mq.test;

import com.primeton.mq.service.DemoService;
import org.apache.cxf.endpoint.Client;
import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;
import org.apache.cxf.jaxws.endpoint.dynamic.JaxWsDynamicClientFactory;
import org.apache.cxf.transport.http.HTTPConduit;
import org.apache.cxf.transports.http.configuration.HTTPClientPolicy;
public class demo {
   public static void main(String[] args) {
       //创建动态客户端
       JaxWsDynamicClientFactory factory = JaxWsDynamicClientFactory.newInstance();
       Client client = factory.createClient("http://localhost:8090/demo/api?wsdl");
       // 需要密码的情况需要加上用户名和密码
       //client.getOutInterceptors().add(new ClientLoginInterceptor(USER_NAME,PASS_WORD));
       HTTPConduit conduit = (HTTPConduit) client.getConduit();
       HTTPClientPolicy httpClientPolicy = new HTTPClientPolicy();
       httpClientPolicy.setConnectionTimeout(2000);  //连接超时
       httpClientPolicy.setAllowChunking(false);    //取消块编码
       httpClientPolicy.setReceiveTimeout(120000);     //响应超时
       conduit.setClient(httpClientPolicy);
       //client.getOutInterceptors().addAll(interceptors);//设置 *
     try{
         Object[] objects = new Object[0];
         // invoke("方法名",参数1,参数2,参数3....);
         objects = client.invoke("sayHello", "sujin");
         System.out.println("返回数据:" + objects[0]);
     }catch (Exception e){
         e.printStackTrace();
     }
}

来源:https://blog.csdn.net/sujin_/article/details/83865124

标签:SpringBoot,WebService
0
投稿

猜你喜欢

  • springcloud-gateway整合jwt+jcasbin实现权限控制的详细过程

    2023-11-20 12:57:09
  • Spring Cloud如何使用Feign构造多参数的请求

    2023-11-03 00:18:31
  • 深入分析java并发编程中volatile的实现原理

    2023-11-23 05:02:25
  • Spring main方法中如何调用Dao层和Service层的方法

    2023-11-28 23:15:19
  • Spring Boot 读取静态资源文件的方法

    2023-08-25 02:53:07
  • Java字符判断的小例子

    2023-08-26 17:29:49
  • Java多线程Atomic包操作原子变量与原子类详解

    2023-08-18 07:46:25
  • AJAX SpringBoot 前后端数据交互的项目实现

    2023-11-24 05:49:48
  • Java 继承与多态超详细梳理

    2023-11-26 09:01:08
  • Flutter验证码输入框的2种方法实现

    2023-07-17 16:22:07
  • Thymeleaf 3.0 自定义标签方言属性的实例讲解

    2023-03-24 20:40:23
  • 使用spring注入枚举类型作为参数

    2023-11-23 13:25:57
  • SpringBoot如何获取Kafka的Topic列表

    2023-11-26 16:01:52
  • 详解java中String、StringBuilder、StringBuffer的区别

    2023-06-17 06:03:23
  • idea 有时提示找不到类或者符号的解决

    2023-11-29 04:10:43
  • SpringBoot2.0集成WebSocket实现后台向前端推送信息

    2023-08-22 18:50:39
  • Android下拉列表spinner的实例代码

    2023-07-31 20:39:47
  • 零基础写Java知乎爬虫之获取知乎编辑推荐内容

    2023-11-29 04:33:39
  • Flutter应用集成极光推送的实现示例

    2023-06-24 03:51:04
  • Java日常练习题,每天进步一点点(7)

    2023-11-27 00:34:58
  • asp之家 软件编程 m.aspxhome.com