异常: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)

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

相关推荐
yyxx4121239 小时前
上海企业如何选择专业的钉钉服务商
java·大数据·人工智能·钉钉
一杯奶茶¥9 小时前
水果销售网站 CRM客户信息管理系统 超市管理系 酒店管理系统 健身房管理系统 在线音乐网站 校园招聘系统
java·vue.js·spring boot·mysql·spring·java项目
重生之后端学习9 小时前
Java入门
java·开发语言·职场和发展
碧海蓝天20229 小时前
C++法则24:在标准 C++ 中,没有任何可移植的方式判断指针 T* pt 指向的内存位置是否已经 构造了对象,程序员必须手动跟踪哪些元素已构造。
java·开发语言·c++
один but you10 小时前
const和constexpr常量表达式
java·前端·javascript
码云数智-大飞10 小时前
RAII 与智能指针深度拆解
java·前端·算法
云烟成雨TD10 小时前
Agent Scope Java 2.x 系列【19】Harness:从零搭建 MySQL 文件系统
java·人工智能·agent
qq36219670510 小时前
阿里裁员新消息(2026最新动态汇总)
java·开发语言·前端
a11177610 小时前
“黑夜流星“个人引导页 网页html
java·前端·html
砚底藏山河10 小时前
沪深A股:如何获取基金持股数据
java·python·数据分析·maven