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

今天在朋友机子上运行代码,在生成token的时候,遇到了这样一个问题:

Caused by: java.lang.NoClassDefFoundError: javax/xml/bind/DatatypeConverter 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 com.zs.base.util.framework.JwtUtil.createToken(JwtUtil.java:48) ~classes/:na

这个问题是因为 javax.xml.bind.DatatypeConverter 在 Java 9 及更高版本中被移除了。当前使用的 jjwt-0.9.1 版本依赖于这个类进行 Base64 编码和解码,但在 Java 9 及之后的版本中,这个类不再存在。我本机用的是8,朋友电脑用的是17。所以会有这个问题。

有几种解决方法:

1. 添加 javax.xml.bind 依赖

你用的是Java 9 或更高版本,可以手动添加 javax.xml.bind 依赖来解决这个问题。你可以在 pom.xml 中添加以下依赖(适用于 Maven):

XML 复制代码
<dependency>
    <groupId>javax.xml.bind</groupId>
    <artifactId>jaxb-api</artifactId>
    <version>2.3.1</version>
</dependency>

如果是 Gradle 项目,添加如下依赖:

Groovy 复制代码
implementation 'javax.xml.bind:jaxb-api:2.3.1'

2. 升级 JJWT 版本(推荐)

考虑升级 JJWT 到一个较新的版本,JJWT 目前已经支持 Java 9+,并且新的版本不会依赖 javax.xml.bind.DatatypeConverter。你可以在 pom.xml 中将 jjwt 的版本升级到较新的版本(例如 0.11.5 或更高)。

XML 复制代码
<dependency>
    <groupId>io.jsonwebtoken</groupId>
    <artifactId>jjwt</artifactId>
    <version>0.11.5</version>
</dependency>

3. 使用替代库

如果你不想使用 javax.xml.bind,可以考虑使用其他 Base64 编码解码库,如 Apache Commons Codec,来替换 JJWT 中的 Base64 解码功能。你需要自定义 JwtBuilder 的签名方法。

相关推荐
此时不提桶,更待何时8 小时前
01-06-A-JVM排查实战详解
java·jvm
vipxieliang9 小时前
ValidX 在 DDD 领域驱动设计中的实践
java·spring boot
ba_pi9 小时前
mysql 查询所有表名并授权
java
ProcessOn官方账号9 小时前
java函数式编程--入门基础
java·编程·函数式编程
一嘴一个橘子9 小时前
优惠券秒杀思路,redis 分布式锁 方式
java
xufengzhu10 小时前
Java 虚拟线程实战指南(JDK 21+)
java·虚拟线程·jdk21+
大猫和小黄10 小时前
吃透Java泛型:从原理避坑到实战落地
java·泛型
Bingo_BIG10 小时前
Java Spring框架:单表的查询、新增、修改、删除、导入、导出
java·spring·前后端
程序猿_极客11 小时前
【免费】分享一套优质的基于SSM的校园失物招领系统的设计与实现,源码+文档+视频详解(讲解)
java·mysql·ssm·课程设计·失物招领系统
白远山12 小时前
上海24小时自助健身房解决方案实战指南与经验分享
java·数据库·架构·需求分析