WebService的services.xml问题

WebService有多种实现方式,这里使用的是axis2

问题:

在本地开发,访问本地的http://localhost:8080/services/ims?wsdl,正常访问
在这里插入图片描述

但是打成jar包,不管是linux还是window启动,都访问不到,报错信息如下

2023-12-28 09:56:20.749 [http-nio-8092-exec-1] WARN  o.a.axiom.util.stax.dialect.StAXDialectDetector[214] - Unable to determine dialect of the StAX implementation at jar:file:/opt/testWebservice.jar!/BOOT-INF/lib/woodstox-core-6.4.0.jar!/
2023-12-28 09:56:21.110 [http-nio-8092-exec-1] ERROR o.apache.axis2.deployment.WarBasedAxisConfigurator[254] - org.apache.axis2.deployment.DeploymentException: The system cannot locate the specified repository location: file:/opt/testWebservice.jar!/BOOT-INF/classes!/WEB-INF: loading repository from classpath
org.apache.axis2.deployment.DeploymentException: The system cannot locate the specified repository location: file:/opt/testWebservice.jar!/BOOT-INF/classes!/WEB-INFat org.apache.axis2.deployment.DeploymentEngine.loadRepository(DeploymentEngine.java:146)at org.apache.axis2.deployment.WarBasedAxisConfigurator.getAxisConfiguration(WarBasedAxisConfigurator.java:205)at org.apache.axis2.context.ConfigurationContextFactory.createConfigurationContext(ConfigurationContextFactory.java:64)at org.apache.axis2.transport.http.AxisServlet.initConfigContext(AxisServlet.java:622)at org.apache.axis2.transport.http.AxisServlet.init(AxisServlet.java:471)at org.apache.catalina.core.StandardWrapper.initServlet(StandardWrapper.java:1106)at org.apache.catalina.core.StandardWrapper.allocate(StandardWrapper.java:763)at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:115)at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90)at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:481)at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:130)at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93)at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343)at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:390)at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63)at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:926)at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1790)at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52)at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191)at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)at java.lang.Thread.run(Thread.java:748)
2023-12-28 09:56:21.160 [http-nio-8092-exec-1] INFO  org.apache.axis2.transport.http.AxisServlet[115] - java.lang.NullPointerException
2023-12-28 09:56:21.161 [http-nio-8092-exec-1] ERROR o.a.c.c.C.[Tomcat].[localhost].[/].[axisServlet][175] - Allocate exception for servlet [axisServlet]
java.lang.NullPointerException: nullat org.apache.axis2.deployment.DeploymentEngine.loadServices(DeploymentEngine.java:136)at org.apache.axis2.deployment.WarBasedAxisConfigurator.loadServices(WarBasedAxisConfigurator.java:275)at org.apache.axis2.context.ConfigurationContextFactory.createConfigurationContext(ConfigurationContextFactory.java:95)at org.apache.axis2.transport.http.AxisServlet.initConfigContext(AxisServlet.java:622)at org.apache.axis2.transport.http.AxisServlet.init(AxisServlet.java:471)at org.apache.catalina.core.StandardWrapper.initServlet(StandardWrapper.java:1106)at org.apache.catalina.core.StandardWrapper.allocate(StandardWrapper.java:763)at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:115)at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90)at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:481)at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:130)at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93)at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343)at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:390)at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63)at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:926)at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1790)at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52)at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191)at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)at java.lang.Thread.run(Thread.java:748)

原因

axis2默认加载的是项目中的WEB-INF/services/conf/META-INF/services.xml,打包以后默认加载的就是jar中的WEB-INF/services/conf/META-INF/services.xml,但是打包后,又不能读取到services.xml,所以报错了

解决

通过IO流,将services.xml保存到本地,然后指定要加载的路径为本地的这个services.xml

import com.tmkj.tcp.FileCopyUtils;
import org.apache.axis2.extensions.spring.receivers.ApplicationContextHolder;
import org.apache.axis2.transport.http.AxisServlet;
import org.apache.commons.io.FileUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.util.ClassUtils;
import org.springframework.util.ResourceUtils;import java.io.File;
import java.io.FileNotFoundException;
import java.io.InputStream;@Configuration
public class AxisWebserviceConfig {private final static Logger log = LoggerFactory.getLogger(AxisWebserviceConfig.class);/*@Beanpublic ServletRegistrationBean<AxisServlet> axisServlet() throws Exception {ServletRegistrationBean<AxisServlet> registrationBean = new ServletRegistrationBean<>();registrationBean.setServlet(new AxisServlet());//将 AxisServlet 映射到 /services/* 的URL路径上,所有请求路径以 /services/* 开头的请求将由 AxisServlet 处理registrationBean.addUrlMappings("/services/*");// InputStream 对象用于从类路径中读取 services.xml 文件InputStream in= ClassUtils.getDefaultClassLoader().getResourceAsStream("WEB-INF/services/conf/META-INF/services.xml");//获取应用程序的当前工作目录,就是当前项目或者jar所在的目录String root = System.getProperty("user.dir");//设置本地存储的services.xml的路径String path=root+"/WEB-INF/services/conf/META-INF/services.xml";//将前面InputStream的流文件保存到本地指定的路径FileUtils.copyInputStreamToFile(in,new File(path));log.info("xml配置文件path={}","{"+root+"/WEB-INF"+"}");//向 AxisServlet 添加一个初始化参数。初始化参数的名称是 axis2.repository.path ,它的值是 services.xml 文件的路径,这个 root+"/WEB-INF" 已经是我们指定的本地的services.xml路径了,如果不指定,默认加载的就是项目中的WEB-INF/services/conf/META-INF/services.xml,打包以后默认加载的就是jar中的WEB-INF/services/conf/META-INF/services.xmlregistrationBean.addInitParameter("axis2.repository.path", root+"/WEB-INF");//设置 AxisServlet 的加载顺序。加载顺序为1,应用程序启动时将加载 AxisServletregistrationBean.setLoadOnStartup(1);return registrationBean;}*/@Beanpublic ServletRegistrationBean<AxisServlet> axisServlet(){ServletRegistrationBean<AxisServlet> registrationBean = new ServletRegistrationBean<>();registrationBean.setServlet(new AxisServlet());//将 AxisServlet 映射到 /services/* 的URL路径上,所有请求路径以 /services/* 开头的请求将由 AxisServlet 处理registrationBean.addUrlMappings("/services/*");/*** 在项目中:获取当前程序编译后截止/WEB-INF路径,这个WEB-INF在resources目录下,最后结果就是E:/test/target/classes/WEB-INF* 在jar包中:结果是:file:/opt/yunwang/evn.jar!/BOOT-INF/lib/woodstox-core-6.4.0.jar!/*/String path = this.getClass().getResource("/WEB-INF").getPath().toString();//在jar中的话,把file:截取掉if(path.toLowerCase().startsWith("file:")){path = path.substring(5);}//如果是jar中,路径中会有!if(path.indexOf("!") != -1){try{//复制classpath下的文件到jar包的同级目录下FileCopyUtils.copy("WEB-INF/services/conf/META-INF/services.xml");}catch (Exception e){e.printStackTrace();}path = path.substring(0, path.lastIndexOf("/", path.indexOf("!"))) + "/WEB-INF";}log.info("xml配置文件path={}","{"+path+"}");//向 AxisServlet 添加一个初始化参数。初始化参数的名称是 axis2.repository.path ,它的值是 services.xml 文件的路径,这个 root+"/WEB-INF" 已经是我们指定的本地的services.xml路径了,如果不指定,默认加载的就是项目中的WEB-INF/services/conf/META-INF/services.xml,打包以后默认加载的就是jar中的WEB-INF/services/conf/META-INF/services.xmlregistrationBean.addInitParameter("axis2.repository.path", path);registrationBean.setLoadOnStartup(1);return registrationBean;}
/*    @Beanpublic ApplicationContextHolder getApplicationContextHolder(){return new  ApplicationContextHolder();}*/
}

以上两个axisServlet方法,都是一样的,将jar中的文件通过流放在本地,放开一个就行,第一个直接用,第二个是用了一个工具类,以下是工具类

import org.apache.commons.io.IOUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;/*** 将jar内的文件复制到jar包外的同级目录下*/
public class FileCopyUtils {private static final Logger log = LoggerFactory.getLogger(FileCopyUtils.class);private static InputStream getResource(String location) throws IOException {InputStream in = null;try {PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();in = resolver.getResource(location).getInputStream();byte[] byteArray = IOUtils.toByteArray(in);return new ByteArrayInputStream(byteArray);} catch (Exception e) {e.printStackTrace();log.error("getResource is error: {}", e);return null;} finally {if (in != null) {in.close();}}}/*** 获取项目所在文件夹的绝对路径** @return*/private static String getCurrentDirPath() {URL url = FileCopyUtils.class.getProtectionDomain().getCodeSource().getLocation();String path = url.getPath();if (path.startsWith("file:")) {path = path.replace("file:", "");}if (path.contains(".jar!/")) {path = path.substring(0, path.indexOf(".jar!/") + 4);}File file = new File(path);path = file.getParentFile().getAbsolutePath();return path;}private static Path getDistFile(String path) throws IOException {String currentRealPath = getCurrentDirPath();Path dist = Paths.get(currentRealPath + File.separator + path);Path parent = dist.getParent();if (parent != null) {Files.createDirectories(parent);}Files.deleteIfExists(dist);return dist;}/*** 复制classpath下的文件到jar包的同级目录下** @param location 相对路径文件,例如kafka/kafka_client_jaas.conf* @return* @throws IOException*/public static String copy(String location) throws IOException {InputStream in = getResource("classpath:" + location);Path dist = getDistFile(location);Files.copy(in, dist);in.close();return dist.toAbsolutePath().toString();}}

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

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

相关文章

金线检测步骤

半导体行业,金线检测是必不可以少的一个检测项,除了焊点,die面,手指以外的必检项目. 重难点在于金线的提取,算法多种多样,找到适合才是关键,涉及到打光,图像处理,这里不做深入分析,软件和硬件配合好才能做的最好. 经典算法Block分析,结合图像检测. 高斯算法提取 边缘检测算法提…

克拉玛依市白碱滩区(克拉玛依高新区)环保产业园生产用气提升工程设计

克拉玛依市白碱滩区(克拉玛依高新区)环保产业园生产用气提升工程设计 (招标编号&#xff1a;JKJL[服招]2024-09) 项目所在地区&#xff1a;新疆维吾尔自治区,克拉玛依市,白碱滩区 一、招标条件 本克拉玛依市白碱滩区(克拉玛依高新区)环保产业园生产用气提升工程设计已由项目审批…

空间域:空间组学的耶路撒冷

文章目录 环境配置与数据SquidpySpaGCN将基因表达和组织学整合到一个图上基因表达数据质控与预处理SpaGCN的超参优化空间域 参考文献 空间组学不能没有空间域&#xff0c;就如同蛋白质不能没有结构域。 摘要&#xff1a; 空间域是反映细胞在基因表达方面的相似性以及空间邻近性…

【Android Studio 启动出错】

Android Studio版本&#xff1a;2022.3.1 出错前操作&#xff1a; 昨晚开着三四个项目&#xff0c;然后太晚了直接关机睡觉&#xff0c;第二天起来开机&#xff0c;启动Android Studio&#xff0c;就出现了这个问题&#xff1a; Internal error. Please refer to https://co…

网络防御保护——课程笔记

一.防火墙 防火墙的主要职责&#xff1a;控制和防护 --- 安全策略 --- 防火墙可以根据安全策略来抓取流量之后做出对应的动作。 防火墙的分类 防火墙的发展进程 防火墙的控制 带内管理 --- 通过网络环境对设备进行控制 --- telnet&#xff0c;ssh&#xff0c;web --- 登录设备…

CUDA笔记

CUDA笔记 nvidia-smi 命令使用 nvidiasmi -q&#xff1a;查询GPU详细信息&#xff1b; nvidia-smi -q -l 0&#xff1a;查询特定GPU详细信息&#xff1b; nvidia-smi -q -l 0 -d MEMORY&#xff1a;显示GPU特定信息&#xff1b; nvidia-smi -h&#xff1a;英伟达的帮助命令。…

C语言——如何进行文件操作

大家好&#xff0c;我是残念&#xff0c;希望在你看完之后&#xff0c;能对你有所帮助&#xff0c;有什么不足请指正&#xff01;共同学习交流 本文由&#xff1a;残念ing原创CSDN首发&#xff0c;如需要转载请通知 个人主页&#xff1a;残念ing-CSDN博客&#xff0c;欢迎各位→…

提升编程效率的利器: 解析Google Guava库之集合篇RangeSet范围集合(五)

在编程中&#xff0c;我们经常需要处理各种范围集合&#xff0c;例如时间范围、数字范围等。传统的集合类库往往只能处理离散的元素集合&#xff0c;对于范围集合的处理则显得力不从心。为了解决这个问题&#xff0c;Google的Guava库提供了一种强大的数据结构——RangeSet&…

【Transformer 】 Hugging Face手册 (01/10)

一、说明 本文是Hugging Face的用户手册。加入 Hugging Face 社区&#xff0c;在模型、数据集和空间上进行协作&#xff0c;通过加速推理获得更快的示例。 二、变形金刚 适用于 PyTorch、TensorFlow 和 JAX 的先进机器学习。 Transformers 提供 API 和工具&#xff0c;可轻松下…

计算机网络-物理层传输介质(导向传输介质-双绞线 同轴电缆 光纤和非导向性传输介质-无线波 微波 红外线 激光)

文章目录 传输介质及分类导向传输介质-双绞线导向传输介质-同轴电缆导向传输介质-光纤非导向性传输介质小结 传输介质及分类 物理层规定电气特性&#xff1a;规定电气信号对应的数据 导向传输介质-双绞线 双绞线的主要作用是传输数据和语音信息。它通过将两根导线以特定的方…

C#,德兰诺依数(Dealnnoy Number)的算法与源代码

1 Dealnnoy Number 德兰诺依数&#xff0c;德兰诺伊数 德兰诺依数是以法国军官、业余数学家亨利德兰诺依&#xff08;Henry Dealnnoy&#xff09;的名字命名。 Henry Dealnnoy 在组合数学中&#xff0c;德兰诺依数描述了从(0,0)到(m,n)的格路问题中&#xff0c; 只允许按照(0…

vue3之echarts3D环柱饼图

vue3之echarts3D环柱饼图 效果&#xff1a; 版本 "echarts": "^5.4.1", "echarts-gl": "^2.0.9" 核心代码&#xff1a; <template><div class"content"><div ref"eCharts" class"chart&…

【uniapp·微信登录】

一、新建文件夹&#xff08;登录&#xff09; 在HBuilderX中开发微信小程序的步骤如下&#xff1a; 在HBuilderX中新建一个uniapp项目。 在HBuilderX中配置安装的微信开发者工具路径&#xff0c;可以通过点击 工具》设置》运行配置–小程序运行配置 进行配置。 在HBuilderX中修…

【MySQL】聚集函数注意事项

聚集函数注意事项 除了 COUNT(*) 不会忽略列值为 NULL 的行&#xff0c;其他的聚集函数都会忽略。 MAX() 也可以返回文本中的最大值&#xff0c;返回排序后的最后一行。 MIN() 也可以返回文本中的最小值&#xff0c;返回排序后的第一行。 使用标准的算术操作符&#xff08;加…

动网格-网格重构之弹性光顺局部重构法(四)

弹性光顺法的基本特点 弹性光顺法中&#xff0c;网格线类似于弹簧&#xff0c;两端节点(node)作弹性移动 弹性光顺法有如下特点。 (1)节点的数量和节点之间的连接关系均不变&#xff0c;即节点之间的连接属性不变。 (2)单独使用时&#xff0c;仅限于变形非常小的情况&#xff…

while 和 do-while

签名&#xff1a;但行好事&#xff0c;莫问前程。 文章目录 前言一、while1、基本语法2、执行过程3、示例 二、do-while1、基本语法2、执行过程3、小练习&#xff08;ATM存款取款机&#xff09; 总结 前言 记录一下while 和 do-while 的使用。 一、while 1、基本语法 ①初始…

【Java万花筒】Java引擎加速:GPU计算与并行处理库助力你的应用翱翔

加速未来&#xff1a;掌握GPU计算&#xff0c;助力Java应用飞跃 前言 随着计算需求的不断增加&#xff0c;GPU计算和并行处理技术成为提高应用程序性能的关键。在Java生态系统中&#xff0c;有许多强大的库和工具&#xff0c;可以帮助开发者充分利用GPU的并行计算能力&#x…

Navicat连接MySQL出现Host is not allowed to connect to this MySQL server 解决方法

翻译 &#xff1a;‘不允许主机连接到此MySQL服务器’ &#xff08;意思是本地账号连接可以登录&#xff0c;但是远程登陆不行&#xff09; 解决方案&#xff1a; 1、输入mysql账号密码&#xff0c;登录mysql mysql -uroot -p2、进入mysql库 use mysql; 3、修改root账号的host…

Java:SpringBoot整合Hashids,实现数据ID加密隐藏

引入依赖 <dependency><groupId>org.hashids</groupId><artifactId>hashids</artifactId><version>1.0.3</version> </dependency>步骤 1、自定义注解 Documented Retention(RetentionPolicy.RUNTIME) Target({ElementType…

OpenHarmony—ArkTS限制throw语句中表达式的类型

规则&#xff1a;arkts-limited-throw 级别&#xff1a;错误 ArkTS只支持抛出Error类或其派生类的实例。禁止抛出其他类型&#xff08;例如number或string&#xff09;的数据。 TypeScript throw 4; throw ; throw new Error();ArkTS throw new Error();限制省略函数返回类…