ruoyi-cloud微服务项目对接第三方系统----改造webService接口

ruoyi-cloud微服务定义webService接口并发布提供第三方系统使用

  • 系统简述
    • 背景介绍
    • 需求说明
      • 解决:
      • 转折:
        • 存在的问题
        • 尝试失败
      • 转机
      • 解决思路整理

系统简述

项目框架已确定,使用 ruoyi-cloud 微服务 开源项目,创建单独业务模块,用于满足项目的需求及后续的功能开发都在该模块之上进行。

背景介绍

项目已搭建并运行一段时间,现因用户与组织机构信息都在N年前的老门户项目中进行维护,后续的项目都需要与该门户对接,通过门户进行用户及组织的信息同步。老门户项目2022年有一次大改造,具体改造内容不详,现同步步骤为::

  1. 门户获取用户调整红头文件 ,客户会将人员组织变动信息通过红头文件等方式下发到集团的各个中心及相关处室,通过转发给门户项目组或通过电话、短信等其他方式,告知门户项目组,人员组织存在变动;
  2. 门户项目组进行人员组织调整,门户项目组的运维人员接收到相关调整要求后,通过门户网站进行人员调整,并通过与信息中心的PI系统功能,将人员组织调整的信息形成相对应的报文信息,通过PI系统进行转发;
  3. PI系统,获取到门户推送信息的要求后,通过各系统提供的webservice接口,向各系统进行报文信息的推送;
  4. 其他系统,接收到PI发送的报文信息后,根据报文信息进行人员组织同步。

需求说明

系统需要提供相对应的webservice接口,用户门户将所需要的报文信息通过PI系统同步向各个系统进行推送,然后解析报文信息,获取调整详情。

解决:

之前接触过的项目未涉及webservice接口对接,故无从下手,通过相关资料的查询,通过系统创建webservice.java 类

@Component
@WebService(endpointInterface = "com.service.WebServiceService ")
//endpointInterface定义包路径 
public class WebServiceImpl implements WebServiceInterface {
	//后续方法里直接调用系统内其他类的实现方法会报控制值,所以在这需要重新定义一个用到的实现方法类,才能够调用里面相应的实现方法
	//定义调用的方法类
    private static ApiServiceImpl ApiService;
    //重写静态方法
    @Autowired
    public void setExchangeApiServiceImpl(ApiServiceImpl ApiService){
        WebServiceImpl.ApiService=ApiService;
    }
    
	@Override
    public void function1(String obj){
    	···
    	exchangeApiService.function3(obj);
    	···
    }
    
	@Override
    public void function2(String obj){
    	···
    	exchangeApiService.function4(obj);
    	···
    }

}

与对应的接口映射类

@WebService
public interface WebServiceInterface (){
	@WebMethod
	void function1(String obj);
	void function2(String obj);
}

在项目启动类中增加发布方法

@EnableCustomConfig
@EnableCustomSwagger2
@EnableRyFeignClients
@SpringBootApplication
public class Application{
	public static void main(String[] args){
		SpringApplication.run(Application.class, args);
		//定义webservice服务的url
		String url= "http://127.0.0.1:8090/service/exchangeApiWebService";
		//发布服务参数(路径,接口类)
		Endpoint.publish(url,new WebServiceImpl());
		System.out.println("启动成功");
	}
}

以上完成 webService 的接口发布,通过门户项目组提供的测试工具 WebserviceStudio,可以成功获取到接口类内的两个方法,并通过WebserviceStudio可以成功获取到门户提供的报文信息,后续的报文解析就省略不提了(无非就是在系统内截取报文中的固定内容,在系统中找到相对应的信息,通过sql进行信息的更新)。
完成任务

转折:

当将接口信息提供给PI系统的管理员后,被告知,接口无法使用!!!
WHAT?!!!我都可以通过接口使用工具发送报文,并成功更新了,你告诉我不能用?什么鬼?
完活收工

存在的问题

我测试的时候可以使用测试用具进行webService接口的测试,但是PI系统无法使用,通过浏览器打开接口网址http://127.0.0.1:8090/service/exchangeApiWebService?wsdl(即-主方法类中发布的那个)
结果类似以下
ruoyi-cloud微服务项目对接第三方系统----改造webService接口_第1张图片
查看了一下网上关于WSDL的说明,发现我的wsdl页面中,只有定义的service名称(图片未展示出来)和方法(上图)
wsdl页面中应该包含的内容可参考下方链接
WSDL说明

尝试失败

询问同事,说可以使用axis2进行web service接口开发,经过尝试,axis第一代失败,无法访问wsdl2java.jar,axis2失败,idea找不到axis2j.jar,两天尝试一无所获,
周末回家无时间继续研究,周一早上到公司,创建新项目,只有@webService的.java文件和方法实现类文件,然后再main[String[ ] args] 中进行发布,启动成功。将代码移植至ruoyi-cloud 新增的业务模块中,报错,无法启动

转机

在微服务中尝试webservice发布时,发现启动类为单独的一类,其余ruoyi-cloud属于spring boot 类,类似以下效果
ruoyi-cloud微服务项目对接第三方系统----改造webService接口_第2张图片
遂,百度搜索,spring boot 配置 web Service,找到以下文章,感觉最为可靠,故尝试:
spring boot 使用 webService
参考步骤进行尝试,可正常访问wsdl页面,且所有定义都可成功获取到,于是,在该基础上进行重命名,按照业务需求进行更名,完成后可依旧成功,打包,部署,服务器也成功,暂时算是解决了这个问题

解决思路整理

后根据以下链接参考,

  1. 创建spring boot 中的 service,提供接口及方法内的具体实现,
  2. 创建spring boot 中的 webService,在实现中调用service中的方法,webService接口中用@webService 注解定义接口用来提供调用
  3. 创建spring boot 中的 configuration,在获取IP地址,并发布服务
  4. 重启该模块服务
  5. 然后打开发布的地址增加?wsdl,可以成功看到所有内容(从下向上:路径、端口、接口名、方法名、请求返回值、定义参数等)
    spring boot 搭建 webService 接口并发布提供第三方访问

写在最后的话
备注
idea中使用axis2不知为何,一直报错,命名jar包已加载,却总是用不了,后面有时间在继续研究吧,先了解了解微服务、nocos等,对了,还有因为这个而耽搁的功能开发也需要继续进行了
PI系统的具体工作及详情也不了解,后续也要继续接触

你可能感兴趣的:(微服务,java)