问题随记
在集成 Jwt 认证时出现以下错误:
代码语言:java复制java.lang.ClassNotFoundException: javax.xml.bind.DatatypeConverter
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641) ~[na:na]
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188) ~[na:na]
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:525) ~[na:na]
at io.jsonwebtoken.impl.Base64Codec.decode(Base64Codec.java:26) ~[jjwt-0.9.1.jar:0.9.1]
at io.jsonwebtoken.impl.DefaultJwtBuilder.signWith(DefaultJwtBuilder.java:99) ~[jjwt-0.9.1.jar:0.9.1]
at cn.techfanyi.fanyi.utils.JwtTokenUtil.generateToken(JwtTokenUtil.java:32) ~[classes/:na]
……
查询了一下资料,大概是因为 io.jsonwebtoken.Jwts.builder 不支持较高版本的 Java,这可能与Java SE 9及更高版本中javax.xml.bind模块的移除相关(这个模块在早期版本(如Java SE 8)中是默认存在的),其中包括了 DatatypeConverter 类。这导致了许多使用 JAXB 的旧代码在升级到 Java 9 或更高版本时遇到类加载问题。
解决方法
解决方案:使用 JDK 的 JAXB 模块:如果你的应用程序依赖于 JAXB,可以考虑以下两种方法来解决这个问题:
- 在 Maven 或 Gradle 中添加依赖:如果你使用 Maven,则可以添加以下依赖:<dependency> <groupId>javax.xml.bind</groupId> <artifactId>jaxb-api</artifactId> <version>2.3.1</version> <!-- 适合你的项目版本 --> </dependency>如果使用 Gradle,可以添加以下依赖:implementation 'javax.xml.bind:jaxb-api:2.3.1' // 适合你的项目版本
- 手动添加 Java EE 模块:如果使用的是 Java 9 或更新版本,并且不想添加额外的依赖,可以通过添加
--add-modules java.xml.bind
或者在module-info.java
文件中声明依赖来解决问题。例如:module your.module.name { requires java.xml.bind; // other requires statements } - 更新到新的 XML 处理库:另一种选择是将你的项目迁移到使用新的 XML 处理库,如
javax.xml.stream
,或者使用更现代的替代方案,如 JSON 格式的数据交换。
生成 token 成功,问题解决。
我正在参与2024腾讯技术创作特训营最新征文,快来和我瓜分大奖!