SpringBoot2 整合 AXIS 服务端和客户端

在这里插入图片描述

文章目录

          • 一、服务端
            • 1. 版本选型
            • 2.导入依赖
            • 3. SERVLET
            • 4. 接口
            • 5.实现类
            • 6. 配置工厂
            • 7.启动类
            • 8. WEB-INF目录1
            • 8. WEB-INF目录2
            • 9. /目录1
            • 9. /目录2
            • 10. wsdd
            • 11. 测试验证
          • 二、客户端
            • 开源源码.

一、服务端
1. 版本选型
阿健/框架版本
spring-boot2.5.4
axis1.4
axis-jaxrpc1.4
commons-discovery0.2
wsdl4j1.6.3
2.导入依赖
      <!--axis start --><dependency><groupId>org.apache.axis</groupId><artifactId>axis</artifactId><version>1.4</version></dependency><dependency><groupId>axis</groupId><artifactId>axis-jaxrpc</artifactId><version>1.4</version></dependency><dependency><groupId>commons-discovery</groupId><artifactId>commons-discovery</artifactId><version>0.2</version></dependency><dependency><groupId>wsdl4j</groupId><artifactId>wsdl4j</artifactId><version>1.6.3</version></dependency><!--axis end -->
3. SERVLET
package com.gblfy.ws.servlet;import org.apache.axis.transport.http.AxisServlet;/*** AxisServlet** @author gblfy* @date 2021-09-17*/
@javax.servlet.annotation.WebServlet(urlPatterns = "/services/*",loadOnStartup = 1,name = "AxisServlet"
)
public class AxisBootServlet extends AxisServlet {
}
4. 接口
package com.gblfy.ws.service;/*** Axis接口** @author gblfy* @date 2021-09-17*/
public interface IAxisService {public String sayHello(String info);public String sayHello2(String info,String info2);
}
5.实现类
package com.gblfy.ws.service.impl;import com.gblfy.ws.service.IAxisService;
import org.springframework.stereotype.Service;/*** Axis接口实现类** @author gblfy* @date 2021-09-17*/
@Service
public class AxisServiceImpl implements IAxisService {/*** @param info* @return*/@Overridepublic String sayHello(String info) {return "sayHello:" + info;}@Overridepublic String sayHello2(String info, String info2) {return info + info2;}
}
6. 配置工厂

新建org.apache.axis.configuration
在新建的包下新建EngineConfigurationFactoryServlet类,集成EngineConfigurationFactoryDefault

第一种:目录为
String appWebInfPath = “/WEB-INF”;

第二种:目录为
String appWebInfPath = “/”;

package org.apache.axis.configuration;/** Copyright 2002-2004 The Apache Software Foundation.** Licensed under the Apache License, Version 2.0 (the "License");* you may not use this file except in compliance with the License.* You may obtain a copy of the License at**      http://www.apache.org/licenses/LICENSE-2.0** Unless required by applicable law or agreed to in writing, software* distributed under the License is distributed on an "AS IS" BASIS,* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.* See the License for the specific language governing permissions and* limitations under the License.*/
import org.apache.axis.AxisProperties;
import org.apache.axis.ConfigurationException;
import org.apache.axis.EngineConfiguration;
import org.apache.axis.EngineConfigurationFactory;
import org.apache.axis.components.logger.LogFactory;
import org.apache.axis.server.AxisServer;
import org.apache.axis.utils.ClassUtils;
import org.apache.axis.utils.Messages;
import org.apache.commons.logging.Log;import javax.servlet.ServletConfig;
import java.io.InputStream;/*** This is a default implementation of ServletEngineConfigurationFactory.* It is user-overrideable by a system property without affecting* the caller. If you decide to override it, use delegation if* you want to inherit the behaviour of this class as using* class extension will result in tight loops. That is, your* class should implement EngineConfigurationFactory and keep* an instance of this class in a member field and delegate* methods to that instance when the default behaviour is* required.** @author Richard A. Sitze* @author Davanum Srinivas (dims@apache.org)*/
public class EngineConfigurationFactoryServletextends EngineConfigurationFactoryDefault {protected static Log log =LogFactory.getLog(EngineConfigurationFactoryServlet.class.getName());private ServletConfig cfg;/*** Creates and returns a new EngineConfigurationFactory.* If a factory cannot be created, return 'null'.* <p>* The factory may return non-NULL only if:* - it knows what to do with the param (param instanceof ServletContext)* - it can find it's configuration information** @see EngineConfigurationFactoryFinder*/public static EngineConfigurationFactory newFactory(Object param) {/*** Default, let this one go through if we find a ServletContext.** The REAL reason we are not trying to make any* decision here is because it's impossible* (without refactoring FileProvider) to determine* if a *.wsdd file is present or not until the configuration* is bound to an engine.** FileProvider/EngineConfiguration pretend to be independent,* but they are tightly bound to an engine instance...*/return (param instanceof ServletConfig)? new EngineConfigurationFactoryServlet((ServletConfig) param): null;}/*** Create the default engine configuration and detect whether the user* has overridden this with their own.*/protected EngineConfigurationFactoryServlet(ServletConfig conf) {super();this.cfg = conf;}/*** Get a default server engine configuration.** @return a server EngineConfiguration*/public EngineConfiguration getServerEngineConfig() {return getServerEngineConfig(cfg);}/*** Get a default server engine configuration in a servlet environment.* <p>* //* @param ctx a ServletContext** @return a server EngineConfiguration*/private static EngineConfiguration getServerEngineConfig(ServletConfig cfg) {String configFile = cfg.getInitParameter(OPTION_SERVER_CONFIG_FILE);if (configFile == null)configFile =AxisProperties.getProperty(OPTION_SERVER_CONFIG_FILE);if (configFile == null) {configFile = SERVER_CONFIG_FILE;}// String appWebInfPath = "/";String appWebInfPath = "/WEB-INF";//由于部署方式变更为jar部署,此处不可以使用改方式获取路径//        ServletContext ctx = cfg.getServletContext();//        String realWebInfPath = ctx.getRealPath(appWebInfPath);FileProvider config = null;String realWebInfPath = EngineConfigurationFactoryServlet.class.getResource(appWebInfPath).getPath();InputStream iss = ClassUtils.getResourceAsStream(EngineConfigurationFactoryServlet.class, appWebInfPath + "/" + SERVER_CONFIG_FILE);if (iss != null) {// FileProvider assumes responsibility for 'is':// do NOT call is.close().config = new FileProvider(iss);}if (config == null) {log.error(Messages.getMessage("servletEngineWebInfError03", ""));}/*** Couldn't get data  OR  file does exist.* If we have a path, then attempt to either open* the existing file, or create an (empty) file.*/if (config == null && realWebInfPath != null) {try {config = new FileProvider(realWebInfPath, configFile);} catch (ConfigurationException e) {log.error(Messages.getMessage("servletEngineWebInfError00"), e);}}/*** Fall back to config file packaged with AxisEngine*/if (config == null) {log.warn(Messages.getMessage("servletEngineWebInfWarn00"));try {InputStream is =ClassUtils.getResourceAsStream(AxisServer.class,SERVER_CONFIG_FILE);config = new FileProvider(is);} catch (Exception e) {log.error(Messages.getMessage("servletEngineWebInfError02"), e);}}return config;}}
7.启动类

在这里插入图片描述

@ServletComponentScan //扫描自定义的WebFilter和WebListener,否则无法扫描到
8. WEB-INF目录1

如果上面工厂的静态目录选择 WEB-INF,请认真阅读这一小节,如果选择/则可以跳过这一小节,静态目录选择 WEB-INF有以下二种场景:
第一种:在main目录下,创建webapp/WEB-INF目录
调整目录属性
在这里插入图片描述

8. WEB-INF目录2

第二种:在resources目录下面WEB-INF目录

9. /目录1

如果 6. 配置工厂选择的静态目录为/,请认真阅读这一小节,有以下二种场景:
第一种:在resources下面存放server-config.wsdd文件

9. /目录2

第二种:在webapp下面存放server-config.wsdd文件
,若果选择在webapp下面存放server-config.wsdd文件,请调整目录属性
在这里插入图片描述

10. wsdd

根据上面选择的场景,在指定的目录下面创建server-config.wsdd文件,内容如下:

  • 第一种:在webapp的WEB-INF目录下面
    在这里插入图片描述

  • 第二种:在webapp目录下面

  • 在这里插入图片描述

  • 第三种:在resources的WEB-INF目录下面
    在这里插入图片描述

  • 第四种:在resources目录下面
    在这里插入图片描述

<?xml version="1.0" encoding="UTF-8"?>
<deployment xmlns="http://xml.apache.org/axis/wsdd/"xmlns:java="http://xml.apache.org/axis/wsdd/providers/java"><handler type="java:org.apache.axis.handlers.http.URLMapper"name="URLMapper"/><!--要告诉别人的接口名--><service name="AxisServiceShell" provider="java:RPC"><!--这个是 实现类--><parameter name="className" value="com.gblfy.ws.service.impl.AxisServiceImpl"/><!--命名空间设置:默认:http://+ip:端口+urlPatterns+name(暴露的服务名)例如:http://localhost:8080/services/AxisServiceShell自定义格式:<namespace>自定义命名空间</namespace>例如:<namespace>com.gblfy.ws.service.impl</namespace>--><!--这是是暴露的方法名   比如可以值暴露一个--><parameter name="allowedMethods" value="sayHello"/><!--这是是暴露的方法名   也可以用* 表示暴露全部的public方法--><!--<parameter name="allowedMethods" value="*" />--></service><transport name="http"><requestFlow><handler type="URLMapper"/></requestFlow></transport></deployment>
11. 测试验证

http://localhost:8080/services/AxisServiceShell?wsdl
在这里插入图片描述

二、客户端
package com.gblfy.ws.client;import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import org.springframework.util.ObjectUtils;import javax.xml.namespace.QName;
import javax.xml.rpc.ParameterMode;
import java.rmi.RemoteException;/*** Axis客户端** @author guobin* @date 2021-09-17*/
@Component
public class AxisClient {private final static Logger log = LoggerFactory.getLogger(AxisClient.class);public static void main(String[] args) throws Exception {String axisUrl = "http://localhost:8080/services/axisServiceShell?wsdl";String namespaceURI = "http://localhost:8080/services/axisServiceShell";// String method = "sayHello";String method = "sayHello2";String reqXml = "1";String reqXml2 = "2";//调用axis服务// AxisClient.axisSendMsg(axisUrl, namespaceURI, method, reqXml);AxisClient.axisSendMsg(axisUrl, namespaceURI, method, reqXml, reqXml2);}/*** @param url       WebService地址* @param namespace 命名空间* @param method    方法* @param tReqXml   请求报文* @return* @throws Exception*/public static String axisSendMsg(String url, String namespace, String method, String tReqXml)throws Exception {Service service = new Service();Call call;String res = null;call = (Call) service.createCall();long forStrTime = 0L;if (StringUtils.isBlank(url)) {throw new RuntimeException("调用url地址等于空,请核实地址是否正确!");}if (StringUtils.isBlank(namespace)) {throw new RuntimeException("调用namespace等于空,请核实命名空间是否正确!");}if (StringUtils.isBlank(method)) {throw new RuntimeException("调用method等于空,请核实方法名是否正确!");}if (ObjectUtils.isEmpty(tReqXml)) {throw new RuntimeException("调发送报文等于空,请核实发送内容是否正确!");}call.setTargetEndpointAddress(new java.net.URL(url));//特殊处理部分    startString subUrl = url.substring(url.lastIndexOf("/"));log.info("转发路径标志 {}", subUrl.substring(1, subUrl.length()));//针对xxx需求添加单独逻辑判断if ("ws_fxhx_ws".equals(subUrl.substring(1, subUrl.length()))) {call.addParameter("xmlStr", org.apache.axis.Constants.XSD_STRING, ParameterMode.IN);call.setReturnType(org.apache.axis.Constants.XSD_STRING);}//特殊处理部分    endcall.setOperationName(new QName(namespace, method));// 这是要调用的方法log.info("开始转发请求报文");forStrTime = System.currentTimeMillis();log.info("开始转发时间: {}-毫秒", forStrTime);try {res = (String) call.invoke(new Object[]{tReqXml});} catch (RemoteException e) {e.printStackTrace();throw e;}long forEndTime = System.currentTimeMillis();log.info("转发结束时间: {}-毫秒", forEndTime);long endToStart = (long) (forEndTime - forStrTime);log.info("转发消耗的时间:: {}-毫秒", endToStart);log.info("响应报文: {}", res);return res;}public static String axisSendMsg(String url, String namespace, String method, String tReqXml, String tReqXml2)throws Exception {Service service = new Service();Call call;String res = null;call = (Call) service.createCall();long forStrTime = 0L;if (StringUtils.isBlank(url)) {throw new RuntimeException("调用url地址等于空,请核实地址是否正确!");}if (StringUtils.isBlank(namespace)) {throw new RuntimeException("调用namespace等于空,请核实命名空间是否正确!");}if (StringUtils.isBlank(method)) {throw new RuntimeException("调用method等于空,请核实方法名是否正确!");}if (ObjectUtils.isEmpty(tReqXml)) {throw new RuntimeException("调发送报文等于空,请核实发送内容是否正确!");}call.setTargetEndpointAddress(new java.net.URL(url));//特殊处理部分    startString subUrl = url.substring(url.lastIndexOf("/"));log.info("转发路径标志 {}", subUrl.substring(1, subUrl.length()));//针对xxx需求添加单独逻辑判断if ("ws_fxhx_ws".equals(subUrl.substring(1, subUrl.length()))) {call.addParameter("xmlStr", org.apache.axis.Constants.XSD_STRING, ParameterMode.IN);call.setReturnType(org.apache.axis.Constants.XSD_STRING);}//特殊处理部分    endcall.setOperationName(new QName(namespace, method));// 这是要调用的方法log.info("开始转发请求报文");forStrTime = System.currentTimeMillis();log.info("开始转发时间: {}-毫秒", forStrTime);try {res = (String) call.invoke(new Object[]{tReqXml, tReqXml2});} catch (RemoteException e) {e.printStackTrace();throw e;}long forEndTime = System.currentTimeMillis();log.info("转发结束时间: {}-毫秒", forEndTime);long endToStart = (long) (forEndTime - forStrTime);log.info("转发消耗的时间:: {}-毫秒", endToStart);log.info("响应报文: {}", res);return res;}
}
开源源码.

https://gitee.com/gblfy/unified-access-center

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

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

相关文章

地理文本处理技术在高德的演进(下)

在【上篇】里&#xff0c;我们介绍了地理文本处理技术在高德的整体演进&#xff0c;选取了几个通用query分析的点进行了介绍。下篇中&#xff0c;我们会选取几个地图搜索文本处理中特有的文本分析技术做出分析&#xff0c;包括城市分析&#xff0c;wherewhat分析&#xff0c;路…

真正拿大厂offer的人,都赢在这一点

学好一门技术最有价值的体现就是“面试”&#xff0c;对于大部分人来说 “面试”是涨薪的主要途径之一&#xff0c;因此我们需要认真的准备面试&#xff0c;因为它直接决定着你今后几年内的薪资水平&#xff0c;所以在面试这件事上花费再多的时间和精力都是值得的。你会发现有…

今天的这个小成绩,需要向阿里云的朋友报告一下!

今天&#xff0c;想向大家报告一个最新的小成绩&#xff1a; 在数据库领域的权威评选——Gartner全球数据库魔力象限评比中&#xff0c;阿里云成功进入“挑战者”象限&#xff0c;连续两年作为唯一的中国企业入选。 最新评选表明&#xff0c;阿里云过去一年在产品技术领域进展迅…

90%的人会遇到性能问题,如何用1行代码快速定位?

阿里妹导读&#xff1a;在《如何回答性能优化的问题&#xff0c;才能打动阿里面试官&#xff1f;》中&#xff0c;主要是介绍了应用常见性能瓶颈点的分布&#xff0c;及如何初判若干指标是否出现了异常。 今天&#xff0c;齐光将会基于之前列举的众多指标&#xff0c;给出一些常…

SpringBoot2 整合 CXF 服务端和客户端

文章目录一、CXF服务端1. 导入依赖2. 创建service接口3. 接口实现类4. cxf配置类5. 查看wsdl结果二、CXF客户端2.1. 客户端2.2. 断点调试2.3. 发起调用服务开源源码.一、CXF服务端 1. 导入依赖 <properties><cxf.version>3.3.1</cxf.version></propertie…

如果张东升是个程序员,你还有机会吗?

来源 | 编程技术宇宙责编 | Carol封图 | CSDN 下载自视觉中国张东升是一家互联网公司的程序员&#xff0c;一直以来都勤勤恳恳老实工作。可最近一段时间&#xff0c;老板接了几个项目回来&#xff0c;不但开启了996的工作模式&#xff0c;更要命的是频频更改需求&#xff0c;弄…

蚂蚁金服资深总监韩鸿源:企业级数据库平台的持续与创新

2019年11月19日&#xff0c;蚂蚁金服在北京举办“巅峰洞见聚焦金融新技术”发布会&#xff0c;介绍2019双11支付宝背后的技术&#xff0c;并重磅发布全新OceanBase 2.2版本。欢迎持续关注&#xff5e; 蚂蚁金服研究员韩鸿源在发布会分享了《企业级数据库平台的持续与创新》&…

jquery标题左右移动动画

标题会在红框范围内来回移动 html和css代码 <div class"menu-notice" click"check_cart"><div class"menu-notice-logo"></div><div class"menu-notice-title" ref"noticeTitle">{{storeinfo[0] ?…

解密 云HBase 冷热分离技术原理

前言 HBase是当下流行的一款海量数据存储的分布式数据库。往往海量数据存储会涉及到一个成本问题&#xff0c;如何降低成本。常见的方案就是通过冷热分离来治理数据。冷数据可以用更高的压缩比算法&#xff08;ZSTD&#xff09;&#xff0c;更低副本数算法&#xff08;Erasure…

再见,工资!2020年6月程序员工资统计,平均14404元,网友:又跌了!

见了鬼&#xff01;工资竟然又跌了2020 年 6 月全国招收程序员 313739 人。2020 年 6 月全国程序员平均工资 14404 元&#xff0c;工资中位数 12500 元&#xff0c;其中 95% 的人的工资介于 5250 元到 35000 元。怪不得小陈发现最近猎头的“骚扰”电话越来越少了&#xff0c;这…

mysql创建function 报错误1418 - This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in

解决方法&#xff1a; 执行这条sql就可以了&#xff1a; set global log_bin_trust_function_creators1;运行结果&#xff1a; 函数创建成功了

一个实时精准触达系统的自我修养

问题定义 在互联网行业&#xff0c;唯一不变的就是一直在变化。作为技术同学&#xff0c;我们经常会碰到以下几种需求&#xff1a; 当用户收藏的商品降价后及时通知用户&#xff0c;促进双方交易达成&#xff1b;新用户或90天内未成交的用户浏览多个商品后引导用户主动和卖家聊…

vue-datepicker的使用

写这个文章主要是记录下用法&#xff0c;官网已经说的很详细了 npm install vue-datepicker --savehtml代码 <myDatepicker :date"startTime" :option"multiOption" :limit"limit"></myDatepicker> <myDatepicker :date"e…

数据库怎么选择?终于有人讲明白了

作者 | Alex Petrov所有数据库管理系统的主要工作都是可靠地存储数据并使其对用户可用。我们使用数据库作为数据的主要来源&#xff0c;帮助我们在应用程序的不同部分之间共享数据。我们使用数据库&#xff0c;而不是在每次创建新应用程序时寻找存储和检索信息的方法&#xff0…

医疗数据典型特征及架构发展方向研究

前言 医疗健康产业目前呈高速发展状态&#xff0c;处在互联网对医疗行业赋能的关键阶段&#xff0c;由于医疗行业数据的隐私性较强&#xff0c;通过传统方式很难获取公开的医疗健康数据进行研究&#xff0c;根据阿里云天池比赛赛题设置研究及提供的脱敏数据集着手进行分析是比…

分布式事务 GTS 的价值和原理浅析

GTS 今年双 11 的成绩 今年 2684 亿的背后&#xff0c;有一个默默支撑&#xff0c;低调到几乎被遗忘的中间件云产品——GTS&#xff08;全局事务服务&#xff0c;Global Transaction Service&#xff09;&#xff0c;稳稳地通过了自 2014 年诞生以来的第 5 次“大考”。 2019 …

kafka java.net.UnknownHostException: node4 Error connecting to node node4:9092

解决&#xff1a;修改kafka的server.properties文件 vim /kafka安装路径/config/server.properties 去除下面这行配置的注释&#xff0c;并设置对应的ip地址 #advertised.listenersPLAINTEXT://your.host.name:9092 advertised.listenersPLAINTEXT://192.168.92.104:9092 重启…

看全新升级的KubeSphere 3.0 如何助力企业在容器混合云时代乘风破浪?

数据时代&#xff0c;层出不穷的创新型业务对企业IT提出了更高的要求&#xff0c;业务、技术和管理方面的挑战也逐渐显现。对此&#xff0c;越来越多的企业希望能够快速、简单地创建企业应用&#xff0c;敏捷地满足业务创新的需求&#xff0c;同时还能维持极高的企业级服务水平…

5G的7大用途,你知道几个?

阿里妹导读&#xff1a;5G时代悄悄来临&#xff0c;甚至成为街头巷尾都在讨论的话题。相信你一定有过一些疑问&#xff1a;什么是5G&#xff1f;仅仅只是网速更快吗&#xff1f;5G如何做到毫秒级的延迟&#xff1f;网络切片是什么&#xff1f;5G的标准之争是怎么回事&#xff0…

ALive:淘宝双11直播,技术同学却可以“偷懒”?

“疯狂的”淘宝直播间 今年直播又火了&#xff01; 2019年双11淘宝直播带来近 200亿 成交&#xff0c;以天猫双11交易总额2684亿计算&#xff0c;直播已经占总成交额的近 7.45%&#xff01; 今年的变化 除了以往的手淘和猫客&#xff0c;现在 UC 浏览器、新浪微博、支付宝、…