问题随记

在集成 Jwt 认证时出现以下错误:

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]
	……
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.

查询了一下资料,大概是因为 io.jsonwebtoken.Jwts.builder 不支持较高版本的 Java,这可能与Java SE 9及更高版本中javax.xml.bind模块的移除相关(这个模块在早期版本(如Java SE 8)中是默认存在的),其中包括了 DatatypeConverter 类。这导致了许多使用 JAXB 的旧代码在升级到 Java 9 或更高版本时遇到类加载问题。

【问题随记】集成 Jwt 认证时出现 java.lang.ClassNotFoundException: javax.xml.bind.DatatypeConverter 问题_spring boot

解决方法

解决方案使用 JDK 的 JAXB 模块:如果你的应用程序依赖于 JAXB,可以考虑以下两种方法来解决这个问题:

  • 在 Maven 或 Gradle 中添加依赖:如果你使用 Maven,则可以添加以下依赖:
<dependency>
    <groupId>javax.xml.bind</groupId>
    <artifactId>jaxb-api</artifactId>
    <version>2.3.1</version> <!-- 适合你的项目版本 -->
</dependency>
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 如果使用 Gradle,可以添加以下依赖:
implementation 'javax.xml.bind:jaxb-api:2.3.1' // 适合你的项目版本
  • 1.
  • 手动添加 Java EE 模块:如果使用的是 Java 9 或更新版本,并且不想添加额外的依赖,可以通过添加 --add-modules java.xml.bind 或者在 module-info.java 文件中声明依赖来解决问题。例如:
module your.module.name {
    requires java.xml.bind;
    // other requires statements
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 更新到新的 XML 处理库:另一种选择是将你的项目迁移到使用新的 XML 处理库,如 javax.xml.stream,或者使用更现代的替代方案,如 JSON 格式的数据交换。

生成 token 成功,问题解决。

【问题随记】集成 Jwt 认证时出现 java.lang.ClassNotFoundException: javax.xml.bind.DatatypeConverter 问题_spring boot_02