ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

java-Spring Boot 1.4.x和自定义CharsetProvider

2019-11-18 05:10:07  阅读:258  来源: 互联网

标签:gsm spring-boot spring java


我正在尝试注册自定义CharsetProvider以便能够使用X-Gsm7Bit编码.我使用Logica的https://github.com/OpenSmpp/opensmpp/tree/master/charset/src/main/java/org/smpp/charset提供程序.
要注册此新的字符集提供程序,请使用META-INF / services / java.nio.charsets.spi.CharsetProvider文件以及内容org.smpp.charset.Gsm7BitCharsetProvider.

我无法使其正常工作.
测试应用程序的来源在这里https://github.com/asmsoft/provider

我得到java.util.ServiceConfigurationError:java.nio.charset.spi.CharsetProvider:当我将其作为胖子启动时找不到提供者org.smpp.charset.Gsm7BitCharsetProvider

mvn clean
mvn package
java -jar target/provider-1.0-SNAPSHOT.jar

如果我使用mvn spring-boot:run启动它,则会得到java.io.UnsupportedEncodingException:X-Gsm7Bit

当我使用IDE启动应用程序时,一切工作正常.

目前,我已按以下方式解决了我的问题:我已将提供自定义字符集的jar放入JAVA_HOME / jre / lib / ext中,并且一切都再次按预期工作,该字符集已在启动时注册.

我对这种解决方案不满意,我想寻求您的帮助.

解决方法:

我认为您在JDK中遇到了一个错误. javadoc for CharsetProvider说:

Charset providers are looked up via the current thread’s context class loader

但是,code that looks up the providers讲述了一个不同的故事:

ClassLoader cl = ClassLoader.getSystemClassLoader();
ServiceLoader<CharsetProvider> sl =
    ServiceLoader.load(CharsetProvider.class, cl);

如您所见,它使用的是系统类加载器,而不是线程的上下文类加载器.

它在您的IDE中有效,因为您的应用程序的类及其依赖项都可用于系统类加载器.当您将应用程序打包到一个胖子罐中时,它会失败,因为您的应用程序的类及其依赖项随后可用于Spring Boot的类加载器,后者是系统类加载器的子级.在使用另一个类加载器的任何环境中,例如在servlet容器中进行传统的war部署,您都会遇到相同的问题.

为避免此问题,您需要使提供程序可用于系统类加载器.如您所知,将其jar放在JAVA_HOME / jre / lib / ext是实现此目的的一种方法.其他选项包括使用阴影罐而不是胖罐,或对胖罐进行后处理,以将提供程序的类直接添加到罐的根中,而不是作为嵌套罐.

标签:gsm,spring-boot,spring,java
来源: https://codeday.me/bug/20191118/2025946.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有