问题随记
在集成 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]
……查询了一下资料,大概是因为 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 {
requires java.xml.bind;
// other requires statements
}- 更新到新的 XML 处理库:另一种选择是将你的项目迁移到使用新的 XML 处理库,如
javax.xml.stream
- ,或者使用更现代的替代方案,如 JSON 格式的数据交换。
生成 token 成功,问题解决。

















