【原创】IPTVC2实现方案(文末有demo)

前言:

名词解释: IPTVC2, 全称: 央视国际节目定价发布接口规范,标准版本当前最新为2.7.12

附赠资源链接,侵删:规范

规范中提供的样例,实现基于axis1.4(2006的时代宠物)

基于axis1版本的实现参考: Spring boot 集成Axis1.4 ,使用wsdd文件发布webservice_董洪臣的博客-CSDN博客

 前辈的参考代码: GitHub - donghc/demo: Spring boot 集成Axis1.4 ,使用wsdd文件发布webservice的demo

博主在重构业务代码(基于axis1)的时候,基于SpringBoot2实现,就参考了董老师的代码。

免责条款:

(1) 本着反哺行业,避免走弯路,故编写本文章且提供demo样例。

(2) 所使用示例代码不包含业务代码,且尽可能与公司使用代码区别,严格遵守脱敏。

(3) 本文所使用代码,基本来自于wsdl文件通过wsdl2java生成。分享的是实现步骤,与业务代码无关。版本基于SpringBoot2.7 axis1.7.9

鸣谢: Springboot集成Axis2——通过wsdl生成webService_axis2根据wsdl生成services.xml_alistair_chow的博客-CSDN博客

背景介绍
c2需要通过WebService进行消息交互,并且文档中规定了wsdl格式。由于目前Springboot对cxf框架支持较好,并没对axis进行较好的集成,但是客户放所规定的wsdl又使用到了仅axis支持的rpc模式,因此不得不使用axis作为Webservice框架进行服务的服务端和客户端的搭建。

实操步骤(axis2实现):


Axis2提供了wsdl2java的工具包,首先需要现在Axis2至本地目录(不用是项目目录)。官网下载地址: http://archive.apache.org/dist/axis/axis2/java/core/

可以选择任意版本。最好和要引入的版本一致。当前最新版本为1.8.2,这里使用1.7.9 进行处理。

(1) 下载工具包到本地路径,如 D:/tmp,并且解压

windows 下执行:

打开cmd

cd到D:/tmp

./wsdl2java.bat -uri ctms.wsdl -d adb -s -ss -sd -ssi -o D:/tmp/ws/server/ctms

这里的ctms结构:

<?xml version="1.0" encoding="UTF-8"?>
<wsdl:definitions targetNamespace="iptv" xmlns:impl="iptv" xmlns:intf="iptv" xmlns:apachesoap="http://xml.apache.org/xml-soap" xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"><wsdl:types><schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="iptv"><import namespace="http://schemas.xmlsoap.org/soap/encoding/"/><complexType name="CSPResult"><sequence><element name="Result" type="xsd:int"/><element name="ErrorDescription" nillable="true" type="soapenc:string"/></sequence></complexType></schema></wsdl:types><wsdl:message name="ExecCmdRequest"><wsdl:part name="CSPID" type="soapenc:string"/><wsdl:part name="LSPID" type="soapenc:string"/><wsdl:part name="CorrelateID" type="soapenc:string"/><wsdl:part name="CmdFileURL" type="soapenc:string"/></wsdl:message><wsdl:message name="ExecCmdResponse"><wsdl:part name="ExecCmdReturn" type="impl:CSPResult"/></wsdl:message><wsdl:portType name="CSPRequest"><wsdl:operation name="ExecCmd" parameterOrder="CSPID LSPID CorrelateID CmdFileURL"><wsdl:input name="ExecCmdRequest" message="impl:ExecCmdRequest"/><wsdl:output name="ExecCmdResponse" message="impl:ExecCmdResponse"/></wsdl:operation></wsdl:portType><wsdl:binding name="ctmsSoapBinding" type="impl:CSPRequest"><wsdlsoap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/><wsdl:operation name="ExecCmd"><wsdlsoap:operation soapAction=""/><wsdl:input name="ExecCmdRequest"><wsdlsoap:body use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="iptv"/></wsdl:input><wsdl:output name="ExecCmdResponse"><wsdlsoap:body use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="iptv"/></wsdl:output></wsdl:operation></wsdl:binding><wsdl:service name="CSPRequestService"><wsdl:port name="ctms" binding="impl:ctmsSoapBinding"><wsdlsoap:address location="http://127.0.0.1"/></wsdl:port></wsdl:service></wsdl:definitions>

这里的ctms.wsdl 是你的soap说明文档,这里可以使用本地绝对路径,或者网络地址。自定替换。

备注: axis2有两种实体类映射形式,一种是adb,一种是xmlsBean这里使用前者,区别自行百度补充。

生成好的文件结构

resources:

 java:

 新建或者使用您既有的业务代码,将生成好的代码贴进去,并且修改相关的路径。

如该结构(截图为ctmsResp也进行生成,粘贴后的样子,可以根据需要进一步调整层次):

 引入pom依赖(仅axis2部分,其他自行引入):

<!-- axis2 --><dependency><groupId>org.apache.axis2</groupId><artifactId>axis2-transport-http</artifactId><version>${axis2.version}</version><exclusions><exclusion><groupId>org.apache.axis2</groupId><artifactId>axis2-kernel</artifactId></exclusion></exclusions></dependency><dependency><groupId>org.apache.axis2</groupId><artifactId>axis2-adb</artifactId><version>${axis2.version}</version></dependency><dependency><groupId>org.apache.axis2</groupId><artifactId>axis2-transport-local</artifactId><version>${axis2.version}</version></dependency><dependency><groupId>org.apache.axis2</groupId><artifactId>axis2-xmlbeans</artifactId><version>${axis2.version}</version></dependency><dependency><groupId>org.apache.axis2</groupId><artifactId>axis2-jaxws</artifactId><version>${axis2.version}</version></dependency><!-- axis2 -->

servlet注册(注意,注册路径要和services.xml所在路径一致):

package com.hmwl.c2service;import com.hmwl.c2service.utils.FileCopyUtils;
import org.apache.axis2.transport.http.AxisServlet;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;import java.io.IOException;/*** axis2配置类,用于设置AxisServlet和访问读取services.xml文件**/
@Configuration
public class Axis2WebServiceConfiguration {//服务访问前缀public static final String URL_PATH = "/services/*";//services.xml文件的位置public static final String SERVICES_FILE_PATH = "WEB-INF/services/axis2/META-INF/services.xml";//AXIS2参数keypublic static final String AXIS2_REP_PATH = "axis2.repository.path";@Beanpublic ServletRegistrationBean axis2Servlet() {ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean();servletRegistrationBean.setServlet(new AxisServlet());servletRegistrationBean.addUrlMappings(URL_PATH);// 通过默认路径无法找到services.xml,这里需要指定一下路径,且必须是绝对路径String path = this.getClass().getResource("/WEB-INF").getPath().toString();if (path.toLowerCase().startsWith("file:")) {path = path.substring(5);}if (path.indexOf("!") != -1) {try {FileCopyUtils.copy(SERVICES_FILE_PATH);} catch (IOException e) {e.printStackTrace();}path = path.substring(0, path.lastIndexOf("/", path.indexOf("!"))) + "/WEB-INF";}//System.out.println("xml配置文件,path={ "+path+" }");servletRegistrationBean.addInitParameter(AXIS2_REP_PATH, path);servletRegistrationBean.setLoadOnStartup(1);return servletRegistrationBean;}}

业务实现: 

com.hmwl.c2service.iptv.CSPRequestServiceSkeleton

com.hmwl.c2service.iptv.CSPResponseServiceSkeleton

发布接口:

<?xml version="1.0" encoding="UTF-8"?>
<!-- This file was auto-generated from WSDL -->
<!-- by the Apache Axis2 version: 1.7.9  Built on : Nov 16, 2018 (12:05:37 GMT) -->
<serviceGroup><service name="ctms"><messageReceivers><messageReceiver mep="http://www.w3.org/ns/wsdl/in-out" class="com.hmwl.c2service.iptv.CSPRequestServiceMessageReceiverInOut"/></messageReceivers><parameter name="ServiceClass">com.hmwl.c2service.iptv.CSPRequestServiceSkeleton</parameter><parameter name="useOriginalwsdl">false</parameter><parameter name="modifyUserWSDLPortAddress">true</parameter><operation name="ExecCmd" mep="http://www.w3.org/ns/wsdl/in-out" namespace="iptv"><actionMapping>iptv/CSPRequest/ExecCmdRequest</actionMapping><outputActionMapping>iptv/CSPRequest/ExecCmdResponse</outputActionMapping></operation></service><service name="ctmsResp"><messageReceivers><messageReceiver mep="http://www.w3.org/ns/wsdl/in-out" class="com.hmwl.c2service.iptv.CSPResponseServiceMessageReceiverInOut"/></messageReceivers><parameter name="ServiceClass">com.hmwl.c2service.iptv.CSPResponseServiceSkeleton</parameter><parameter name="useOriginalwsdl">false</parameter><parameter name="modifyUserWSDLPortAddress">true</parameter><operation name="ResultNotify" mep="http://www.w3.org/ns/wsdl/in-out" namespace="iptv"><actionMapping>iptv/CSPResponse/resultNotifyRequest</actionMapping><outputActionMapping>iptv/CSPResponse/resultNotifyResponse</outputActionMapping></operation></service>
</serviceGroup>

测试:

可能遇到的问题:

(1) 使用axis2调用axis1,会遇到multiRef问题。可以通过重写ServiceClient实现,参考:

com.hmwl.c2service.utils.MyServiceClient

原本的实现在getBody后会getFirstElement(),则无法获取到ref标签。

这里整体返回回去后,可以通过自定义解析dom去处理。

如下文:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><soapenv:Body><ns1:resultNotifyResponse soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:ns1="iptv"><resultNotifyReturn href="#id0"/></ns1:resultNotifyResponse><multiRef id="id0" soapenc:root="0" soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xsi:type="ns2:CSPResult" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:ns2="iptv"><Result xsi:type="xsd:int">0</Result><ErrorDescription xsi:type="soapenc:string">Success</ErrorDescription></multiRef></soapenv:Body>
</soapenv:Envelope>

(2) jar包冲突问题。

比如遇到servletApi2.3的冲突。这是由于axis2-spring的jar引发的。后来发现没用上,就整个去掉了。

比如遇到import org.apache.axis2.transport.http.AxisServlet; 引入不了,可以排除下

        <dependency><groupId>org.apache.axis2</groupId><artifactId>axis2-transport-http</artifactId><version>1.7.9</version><exclusions><exclusion><groupId>org.apache.axis2</groupId><artifactId>axis2-kernel</artifactId></exclusion></exclusions></dependency>

(3)The endpoint reference (EPR) for the Operation not found 

发布的名称和调用的名称不一致

(4) org.apache.axis2.databinding.ADBException: Unexpected subelement correlateID

工单这个字段大小写调用和服务端不一致。

com.hmwl.c2service.iptv.ExecCmdResponse 或者回调的Response中看一下,这个报错是在生成的代码里出现的。可以把equals修改成忽略大小写。

还有一些其他报错。反正前前后后,踩了不少坑。

如果其他需要axis1 使用axis2替换的朋友们刷到了这个帖子,希望能帮到你。

demo资源分享(免费好了,就不传csdn资源了,大家搬运请注明出处,且不要任何形式收费哦):

github | gitee(推荐)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/17853.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【CSDN】

欢迎使用Mark编辑器 你好&#xff01; 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章&#xff0c;了解一下Markdown的基本语法知识。 新的改变 我们对Markdown编辑器进行了一些功能拓展与语法支持&#xff0c…

自动驾驶感知系统-全球卫星定位系统

卫星定位系统 车辆定位是让无人驾驶汽车获取自身确切位置的技术&#xff0c;在自动驾驶技术中定位担负着相当重要的职责。车辆自身定位信息获取的方式多样&#xff0c;涉及多种传感器类型与相关技术。自动驾驶汽车能够持续安全可靠运行的一个关键前提是车辆的定位系统必须实时…

【数学建模】——拟合算法

【数学建模】——拟合算法 拟合算法定义&#xff1a;与插值问题不同&#xff0c;在拟合问题中不需要曲线一定经过给定的点。拟合问题的目标是寻求一个函数&#xff08;曲线&#xff09;&#xff0c;使得该曲线在某种准则下与所有的数据点最为接近&#xff0c;即曲线拟合的最好&…

好用的Linux远程工具

你好&#xff0c;我是Martin&#xff0c;今天给大家介绍几款主流的远程工具。 远程工具介绍 关于远程连接的用户分类时这样的&#xff0c;通常需要进行远程连接的人有两类&#xff0c;一类是系统管理员&#xff0c;另一类是普通的用户。远程连接工具是一些可以让你通过网络连接…

2023年华数杯建模思路 - 复盘:光照强度计算的优化模型

文章目录 0 赛题思路1 问题要求2 假设约定3 符号约定4 建立模型5 模型求解6 实现代码 0 赛题思路 &#xff08;赛题出来以后第一时间在CSDN分享&#xff09; https://blog.csdn.net/dc_sinor?typeblog 1 问题要求 现在已知一个教室长为15米&#xff0c;宽为12米&#xff0…

Nacos配置中心设置Mongodb

目录 1.common模块导入nacos config依赖 2.common模块新建bootstrap.yaml 3.在自己的模块导入common模块依赖 4.打开nacos新建配置&#xff0c;发布 5.运行服务并测试 效果&#xff1a;在部署完成后&#xff0c;其他人可以自动连接到你本地mongoDB数据库&#xff0c;无需再…

建模教程:如何利用3ds Max 和 After Effects 实现多通道渲染和后期合成

推荐&#xff1a; NSDT场景编辑器 助你快速搭建可二次开发的3D应用场景 1. 创建基本场景 步骤 1 打开 3ds Max。 打开 3ds Max。 步骤 2 我做了一个简单的场景。我放了三个 彼此之间有一定距离的物体。 制作对象 步骤 3 按 Ctrl-C 键 在透视视图中创建摄影机。 创建相机 …

Android性能优化—LeakCanary内存泄漏检测框架分析。

一、什么叫内存泄漏、内存溢出&#xff1f; 内存溢出(out of memory)&#xff1a;是指程序在申请内存时&#xff0c;没有足够的内存空间供其使用&#xff0c;出现out of memory&#xff1b;比如申请了一个10M的Bitmap&#xff0c;但系统分配给APP的连续内存不足10M&#xff0c…

P3372 【模板】线段树 1(内附封面)

【模板】线段树 1 题目描述 如题&#xff0c;已知一个数列&#xff0c;你需要进行下面两种操作&#xff1a; 将某区间每一个数加上 k k k。求出某区间每一个数的和。 输入格式 第一行包含两个整数 n , m n, m n,m&#xff0c;分别表示该数列数字的个数和操作的总个数。 …

数据库管理员知识图谱

初入职场的程序猿&#xff0c;需要为自己做好职业规划&#xff0c;在职场的赛道上&#xff0c;需要保持学习&#xff0c;并不断点亮自己的技能树。  成为一名DBA需要掌握什么技能呢&#xff0c;先让Chat-GPT为我们回答一下&#xff1a; 数据库管理系统 (DBMS)知识&#xff…

B079-项目实战--支付模块 定时任务 项目总结

目录 概述示例jar包配置类任务详情 项目应用封装的工具类QuartzUtils封装IQuartzSrvice和QuartzServiceImpl封装参数QuartzJobInfo编写任务逻辑MainJob调用第三方支付前添加定时任务异步回调后移除定时任务 订单支付整体流程 概述 优势&#xff1a;Tmer不支持持久化&#xff0…

Java的JDBC编程

目录 一、概念 二、Java代码操作MySQL 1、创建一个项目 2、引入MySQL的驱动包&#xff0c;作为项目的依赖 3、把 jar包 导入到项目中 4、创建一个数据源 5、建立网络上的连接 6、构造SQL语句 7、执行 sql 语句 8、释放必要的资源.关闭连接 一、概念 JDBC &#xff0c;即…

【Jquery大事件时间线】jquery实现大事件时间线(时间轴)的滚动切换效果『附完整源码』

文章目录 写在前面涉及知识点页面效果1、搭建框架1.1 模块搭建1.2 内容填充1.3 时间线的切换 2、完整代码2.1 html源码2.2 CSS源码2.3 js源码 3、完整源码包下载3.1百度网盘3.2 123云盘3.3邮箱留言 总结 写在前面 其实这种大事件记录的web页面也是我们常见的&#xff0c;尤其是…

Go语言性能优化建议与pprof性能调优详解——结合博客项目实战

文章目录 性能优化建议Benchmark的使用slice优化预分配内存大内存未释放 map优化字符串处理优化结构体优化atomic包小结 pprof性能调优采集性能数据服务型应用go tool pprof命令项目调优分析修改main.go安装go-wrk命令行交互界面图形化火焰图 性能优化建议 简介&#xff1a; …

使用redis-cli操作redis

redis-cli是原生redis自带的命令行工具&#xff0c;可以帮助我们通过简单的命令连接redis服务&#xff0c;并进行数据管理&#xff0c;即redis键&#xff08;key&#xff09;和redis数据结构的管理。 关于如何进入redis-cli命令行客户端&#xff0c;请查看文章&#xff1a;Redi…

CMake:为Eigen库使能向量化

CMake:为Eigen库使能向量化 导言构建Eigen项目结构CMakeLists.txt相关源码 导言 本篇开始将涉及检测外部库相关的内容&#xff0c;期间会穿插着一些其他的内容。为了能够使得系统在系统中运行Eigen库&#xff0c;我们首先需要在系统中配置好Eigen库。然后介绍与Eigen库相关的C…

【Android】APP启动优化学习笔记

启动优化目的 用户体验&#xff1a; 应用的启动速度直接影响用户体验。用户希望应用能够快速启动并迅速响应他们的操作。如果应用启动较慢&#xff0c;用户可能会感到不满&#xff0c;并且有可能选择卸载或切换到竞争对手的应用。通过启动优化&#xff0c;可以提高应用的启动…

132个心理性格趣味测试ACCESS\EXCEL数据库

今天又遇到了一个心理测试的数据库&#xff0c;这个数据库在表结构的设置上很直观&#xff0c;属于那种好的数据库结构&#xff0c;共分三个表&#xff0c;一个是测试项目描述表、一个是测试题选项得分表、一个是根据得分区间解析表&#xff0c;表与表之间通过“question_id”字…

【Python】pyqt6入门到入土系列,非常详细...

前言 嗨喽&#xff0c;大家好呀~这里是爱看美女的茜茜呐 一、什么是PyQt6? 简单介绍一下PyQt6 1、基础简介 PyQt6 Digia 公司的 Qt 程序的 Python 中间件。Qt库是最强大的GUI库之一。 PyQt6的官网&#xff1a;www.riverbankcomputing.co.uk/news。 PyQt6是由Riverbank Co…

MTK system_server 卡死导致手机重启案例分析

和你一起终身学习&#xff0c;这里是程序员Android 经典好文推荐&#xff0c;通过阅读本文&#xff0c;您将收获以下知识点: 一、MTK AEE Log分析工具二、AEE Log分析流程三、system_server 卡死案例分析及解决 本文主要针对 Exception Type: system_server_watchdog , system_…