异常:java.lang.NoClassDefFoundError: javax/xml/bind/DatatypeConverter

异常本质

jjwt-0.9.1 在生成签名时,需要调用 javax.xml.bind.DatatypeConverter.printBase64Binary(...) 做 Base64 编码。

JDK 9+ 开始 JAXB(java.xml.bind)被移出默认类路径,于是出现
java.lang.NoClassDefFoundError: javax/xml/bind/DatatypeConverter。

一句话:老版本 jjwt 依赖了 JDK 8 自带、但 JDK 9+ 不再默认提供的 JAXB API。


最简修复方案(继续使用 jjwt-0.9.x)

在 pom.xml 把 JAXB 显式加回来:

xml 复制代码
<!-- 适用于 JDK 9/11/17/21 -->
<dependency>
    <groupId>javax.xml.bind</groupId>
    <artifactId>jaxb-api</artifactId>
    <version>2.3.1</version>
</dependency>
<!-- 如果还缺实现,再加一个实现包 -->
<dependency>
    <groupId>org.glassfish.jaxb</groupId>
    <artifactId>jaxb-runtime</artifactId>
    <version>2.3.9</version>
</dependency>

刷新 Maven → 重启 → DatatypeConverter 能找到,异常消失。


根治方案(推荐)

jjwt-0.9.1 已停止维护,官方 0.10+ 以后改用自己实现的 Base64,彻底去掉 JAXB 依赖。

  1. 升级依赖(Spring Boot 3.x 示例,jjwt 0.12.5)
xml 复制代码
<dependency>
    <groupId>io.jsonwebtoken</groupId>
    <artifactId>jjwt-api</artifactId>
    <version>0.12.5</version>
</dependency>
<dependency>
    <groupId>io.jsonwebtoken</groupId>
    <artifactId>jjwt-impl</artifactId>
    <version>0.12.5</version>
    <scope>runtime</scope>
</dependency>
<dependency>
    <groupId>io.jsonwebtoken</groupId>
    <artifactId>jjwt-jackson</artifactId>
    <version>0.12.5</version>
    <scope>runtime</scope>
</dependency>
  1. 工具类微调(API 变化)
java 复制代码
// 生成
String token = Jwts.builder()
        .setClaims(claims)
        .signWith(SignatureAlgorithm.HS256, jwtProperties.getAdminSecretKey().getBytes(StandardCharsets.UTF_8))
        .setExpiration(new Date(System.currentTimeMillis() + jwtProperties.getAdminTtl()))
        .compact();

// 解析
Claims claims = Jwts.parserBuilder()
        .setSigningKey(jwtProperties.getAdminSecretKey().getBytes(StandardCharsets.UTF_8))
        .build()
        .parseClaimsJws(token)
        .getBody();

升级后无论 JDK 8 还是 JDK 21 都不再需要 JAXB。


快速判断选哪种

场景 做法
项目即将下线 / 懒得改代码 加 jaxb-api 依赖,5 分钟搞定
长期维护 / 想跑 JDK 17+ 直接升 jjwt 0.12.x(或 1.0 GA)

把依赖改完、重新打包,日志里就不会再出现 DatatypeConverter 的 ClassNotFoundException 了。

相关推荐
Pniubi5 小时前
HashMap的扩容和树化边界
java·开发语言
Mikko75 小时前
用 Java 复刻了高中时在塞班上玩的「熔岩矿车」:纯 Swing、零依赖、没有一张图片,一个 jar 双击就能玩
java·游戏开发·swing
知了学历孙老师5 小时前
小自考的校考和统考,出题方和难度差在哪
java·大数据·前端
Java爱好狂.5 小时前
Java初学者如何一周速通SpringBoot!
java·spring boot·后端·spring·高并发·架构师·java面试
秋饼6 小时前
LLM API密钥动态轮换实战:Spring Vault + Spring AI + 多Provider路由
java·ai·技术分享·后端开发
福兮说7 小时前
JSON 格式正确,数据就可靠吗?我用一份自编配置检查类型与空值
java·前端·json
紧跟先前的步伐9 小时前
Go AI Agent 实战 03|Token、上下文窗口与模型调用成本
java·人工智能·golang
const_qiu9 小时前
第四章 00:开篇 —— 从「会聊天」到「记得住、会干活、能协作」
java·开发语言·人工智能·python
Wang's Blog9 小时前
Java 项目实战: 交友项目 - 个人资料管理的更新接口实现与坑
java·开发语言·交友
Promising_GEO9 小时前
GEE实战02期:从卫星波段开始:利用 Sentinel-2 自己计算 NDVI
java·sentinel·遥感·空间分析