作者:故事我忘了
个人微信公众号:程序猿的月光宝盒

前言

​ 最近公司接的项目需要对接第三方服务,这个服务商是用的WebService开的接口提供调用

​ 因为是内网项目,所以内网映射外网的服务器还没提供过来,所以为了自己以后不加班(这是真实存在的吗?自我安慰叭),所以自己写了个springboot服务发布WS服务,放到服务器上练练手

​ 上一篇博客(《pringBoot打包到docker(idea+传统方式)》)其实是这篇博客之后的事儿

​ 本来昨天就得写的,奈何家里的电脑,只能打游戏,昨天想写,发现连Typora都没有.别说图床,git了,写个钩叭~

另外,蒸汽厂打折了啊,还不买吗

开干

1.涉及技术点

​ SpringBoot+Webservice+Hutool(主要做一个调用WS的SoapClient)

上一张尴图先

都说Hutool用的越早,下班越早,但是不排除我不会用导致的加班

2.整体项目结构

3.Provider 发布Ws服务端

首先,肯定要修改pom文件

依赖加上
  <dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency> <!-- 小辣椒,简化代码 -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency> <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency> <!--发布ws需要用到的依赖-->
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-frontend-jaxws</artifactId>
<version>3.4.5</version>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-transports-http</artifactId>
<version>3.4.5</version>
</dependency> <!-- hutool 的包 -->
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.7.14</version>
</dependency>
</dependencies>

3.0 因为用对象的形式反参,所以建个对象

UserLoginVO

package com.jinsc.provider.vo;

import lombok.Data;

import java.io.Serializable;

/**
* 用户登录VO
*
* @author 金聖聰
* @version v1.0
* @email jinshengcong@163.com
* @since Created in 2021/10/21 23:28
*/
@Data
public class UserLoginVO implements Serializable {
private static final long serialVersionUID = 2673128718180426817L;
private Integer errorCode;
private String errMsg;
private String name; public UserLoginVO() {
} public UserLoginVO(Integer errorCode, String errMsg, String name) {
this.errorCode = errorCode;
this.errMsg = errMsg;
this.name = name;
}
}

3.1 首先写一个service,正常写就完事了,唯一不同的就是注解这块用WS的注解

LoginService

package com.jinsc.provider.service;

import com.jinsc.provider.vo.UserLoginVO;

import javax.jws.WebParam;
import javax.jws.WebService; /**
* ws的登录接口
*
* @author 金聖聰
* @version v1.0
* @email jinshengcong@163.com
* @since Created in 2021/10/21 11:01
*/
@WebService(name = "LoginService", //暴露服务名称
targetNamespace = "http://jinsc.com" //空间名称
)
public interface LoginService {
UserLoginVO userLogin(@WebParam(name = "name") String name);
}

3.2 写他的实现类

LoginServiceImpl

package com.jinsc.provider.service.impl;

import com.jinsc.provider.service.LoginService;
import com.jinsc.provider.vo.UserLoginVO;
import org.springframework.stereotype.Service; import javax.jws.WebParam;
import javax.jws.WebService; /**
* ws的登录接口实现类
*
* @author 金聖聰
* @version v1.0
* @email jinshengcong@163.com
* @since Created in 2021/10/21 11:05
*/
@WebService(serviceName = "LoginService", // 与接口中的name保持一致
targetNamespace = "http://jinsc.com", // 与接口中的name保持一致
endpointInterface = "com.jinsc.provider.service.LoginService" // 接口包路径
)
// 用于配置类自动注入
@Service
public class LoginServiceImpl implements LoginService {
@Override
public UserLoginVO userLogin(@WebParam(name = "name") String name) {
return new UserLoginVO(500, "登录失败~~", name);
} }

3.3 写WS的Cxf配置类

CxfConfig

package com.jinsc.provider.config;

import com.jinsc.provider.service.LoginService;
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.annotation.Resource;
import javax.xml.ws.Endpoint; /**
* ws的配置类
*
* @author 金聖聰
* @version v1.0
* @email jinshengcong@163.com
* @since Created in 2021/10/21 11:14
*/
@Configuration
public class CxfConfig {
@Resource
private LoginService loginService; /**
* 用于注册CXFServlet的
* 地址/webservice/*
* * 通配符 更上接口地址
*
* @return org.springframework.boot.web.servlet.ServletRegistrationBean<org.apache.cxf.transport.servlet.CXFServlet>
* @author 金聖聰
* @email jinshengcong@163.com
* Modification History:
* Date Author Description version
* --------------------------------------------------------*
* 2021/10/21 11:25 金聖聰 修改原因 1.0
*/
@Bean
public ServletRegistrationBean<CXFServlet> dispatcherServlet2() {
// 这里就是发布服务的跟路径,后面 * 是通配符,表示跟什么都行
return new ServletRegistrationBean<>(new CXFServlet(), "/webservice/*");
} @Bean(name = Bus.DEFAULT_BUS_ID)
public SpringBus springBus() {
return new SpringBus();
} @Bean
public Endpoint endpoint() {
// 建立一个端点 ,第一个参数是 springBus 对象,第二个参数是刚才的接口实现类(因为在实现类中用了@service,所以这里可以自动注入)
// PS: 要是有多个service,这个方法对象多写几个就行
EndpointImpl endpoint = new EndpointImpl(springBus(), loginService);
// 这里就是发布的这个接口的地址
endpoint.publish("/loginApi");
return endpoint;
}
}

这样,这个WS就可以发布了

地址是

ip:端口/webservice/loginApi?wsdl

本机启动就是

http://localhost:8080/webservice/loginApi?wsdl

以上,发布成功

4.consumer 调用Ws端所以我称之为消费端

同样,给上pom依赖

  <dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency> <!-- 小辣椒简化代码 -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency> <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency> <!-- hutool的包 -->
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.7.14</version>
</dependency>
</dependencies>

4.0 因为用对象形式解析参数所以创建对象

UserLoginDto

package com.jinsc.consumer.dto;

import lombok.Data;

import java.io.Serializable;

/**
* 用户登录Dto
*
* @author 金聖聰
* @version v1.0
* @email jinshengcong@163.com
* @since Created in 2021/10/21 23:36
*/
@Data
public class UserLoginDto implements Serializable {
private static final long serialVersionUID = 1292974846576856351L;
private String errMsg;
private String name;
private String errorCode;
}

4.1 创建个客户端去调用ws服务就ojbk了啊

不过在此之前,我们用SoapUI去解析下刚才的ws地址

由上,我们可以得到

命名空间: http://jinsc.com

方法名 : jin:userLogin

入参: name

所以我们可以创建SoapClient

TestWsConnect

package com.jinsc.consumer.client;

import cn.hutool.core.convert.Convert;
import cn.hutool.core.lang.Console;
import cn.hutool.core.util.XmlUtil;
import cn.hutool.http.webservice.SoapClient;
import com.jinsc.consumer.dto.UserLoginDto;
import org.w3c.dom.Document; import javax.xml.xpath.XPathConstants;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List; /**
* 测试ws连接
*
* @author 金聖聰
* @version v1.0
* @email jinshengcong@163.com
* @since Created in 2021/10/21 23:35
*/
public class TestWsConnect {
public static void main(String[] args) {
// 新建客户端
SoapClient client = SoapClient.create("http://localhost:8080/webservice/loginApi?wsdl")
// SoapClient client = SoapClient.create("http://服务器端口地址/webservice/loginApi?wsdl")
// 设置要请求的方法,此接口方法前缀为web,传入对应的命名空间
.setMethod("jin:userLogin", "http://jinsc.com")
// 设置参数,此处自动添加方法的前缀:jin
// false的意思就是没有前缀
.setParam("name", "jinshengcong3080ti", false); // 发送请求,参数true表示返回一个格式化后的XML内容
// 返回内容为XML字符串,可以配合XmlUtil解析这个响应
String send = client.send(true);
Console.log(send);
// 把send返回的xml内容转换成document对象
Document document = XmlUtil.parseXml(send);
List<String> nameList = Arrays.asList("errMsg", "errorCode", "name");
HashMap<String, String> resultMap = new HashMap<>();
nameList.forEach(e -> {
// 循环上面的nameList列表,每个元素都是return后面的标签,得标签里面的值
String result = (String) XmlUtil.getByXPath("//return/" + e, document, XPathConstants.STRING);
// 然后给结果map赋值,key是name,value是标签中的值
resultMap.put(e, result);
});
// 得到结果map
Console.log(resultMap);
// map转Dto,其中属性要一致
UserLoginDto convert = Convert.convert(UserLoginDto.class, resultMap);
Console.log(convert); }
}

这样就可以了

运行一下康康~

好了,ojbk

SpringBoot发布webservice服务并调用(hutool yyds)的更多相关文章

  1. CXF发布webService服务以及客户端调用

    这篇随笔内容是CXF发布webService服务以及客户端调用的方法 CXF是什么? 开发工作之前需要下载CXF和安装 下载地址:http://cxf.apache.org 安装过程: <1&g ...

  2. WebService-01-使用jdk发布第一个WebService服务并调用

    Webservice是SOAP+XML,SOAP是基于Http的,Http底层是Socket,先回顾一下Socket: Server: public class Server { public sta ...

  3. 使用CXF发布WebService服务简单实例

    一.说明: 前面介绍了使用axis2来发布Webservice服务,现在介绍一种更popular,更高效的Webservice服务发布技术:CXF Apache CXF = Celtix + XFir ...

  4. Spring整合CXF之发布WebService服务

    今天我们来讲下如何用Spring来整合CXF,来发布WebService服务: 给下官方文档地址:http://cxf.apache.org/docs/writing-a-service-with-s ...

  5. C#调用WebService服务(动态调用)

    原文:C#调用WebService服务(动态调用) 1 创建WebService using System; using System.Web.Services; namespace WebServi ...

  6. dubbo发布webservice服务

    dubbo发布webservice服务 学习了:https://blog.csdn.net/zhangyunpengchang/article/details/51567127 https://blo ...

  7. Aixs2发布webservice服务

    http://www.blogjava.net/pzxsheng/archive/2012/12/21/393319.html 开发前准备:    1.Eclipse Java EE IDE(Juno ...

  8. 使用CXF框架,发布webservice服务,并使用客户端远程访问webservice

    使用CXF框架,发布webservice服务,并使用客户端远程访问webservice  1. CXF介绍 :soa的框架    * cxf 是 Celtrix (ESB框架)和 XFire(webs ...

  9. soamanager发布的Webservice服务,调用时出现http500报错

    最近再给薪酬那边发布ws服务时出现了报错,调用方反馈了errorCode:BEA-380002.在使用XMLspy工具去调用这个WSDL时候,则反馈http500的错误消息.如下图: 遇到这种问题我通 ...

  10. So easy Webservice 6.使用EndPoint发布webservice服务

    创建第一个Web服务: @WebService // 添加了此注解,代表是一个WebService public class HelloWorld { // 非 static final privat ...

随机推荐

  1. BUGKU_PWN_OVERFLOW2_WP

    WP_OVERFLOW2 拿到程序,首先放到我们的kali里面看看是多少位的程序,然后在看看有没有什么安全属性 64位程序,并且开启了RELRO,NX 也就是说,这道题我们需要使用ROP绕过 使用id ...

  2. 在GNU Hurd中感受Mach微内核的进程通信(IPC)

    什么是GNU Hurd 具体的时间线已经在官方维基页面得到详细描述[0],笔者在此就简单叙述一下.在1983年Richard Stallman开启了GNU项目,目的是创建一个自由的操作系统[1].在接 ...

  3. Oracle锁表及解锁方法

    1. 首先查看数据库中哪些表被锁了,找到session ID: 使用sql: select b.owner,b.object_name,a.session_id,a.locked_modefrom v ...

  4. 【Python】面向对象版学员管理系统

    面向对象版学员管理系统 一. 系统需求 使用面向对象编程思想完成学员管理系统的开发,具体如下: 系统要求:学员数据存储在文件中 系统功能:添加学员.删除学员.修改学员信息.查询学员信息.显示所有学员信 ...

  5. DeepseekScanner deepseek+python实现代码审计实战

    一.功能概述 DeepseekScanner实现了扫描源代码项目中的所有代码文件发送给deepseek进行安全审计的功能.具体细节包括扫描所有子目录中的代码文件,然后依次将代码文件切片发送到deeps ...

  6. 使用XML的方式编写:@Aspect运用

    例子. 接口 public interface Calculator { // 加 public int add(int i, int j); // 减 public int sub(int i, i ...

  7. 如何使用Git命令将代码上传到GitHub

    1. 首先在我们的计算机上创建文件夹:例如取名:test 2. 进入test文件夹后点击鼠标右键,选择打开Git Bash. 3. 将我们创建的文件夹初始化为Git仓库:git init 4. 将要上 ...

  8. 🎀springboot 项目启动自动打开浏览器访问网站设置

    简介 Springboot 项目启动自动打开浏览器访问网站设置 环境 windows 实现 在需要打开网址的地方添加: // 启动打开默认浏览器访问 try { Runtime.getRuntime( ...

  9. 解决 windows 10 WSL 安装Ubuntu后 屏幕亮度飙至最高 且屏幕亮度无法调节 外接显示器无法显示 的问题

    转载请注明出处:博客园 博主Bubgit https://www.cnblogs.com/Bubgit/p/16367937.html 问题现象 自从windows 10推出了 wsl (Window ...

  10. web自动化的元素定位

    一.基础元素定位 1.id定位:根据元素的id定位 By.id("id") webDriver.findElement(By.id("tab-account") ...