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 的签名方法。

相关推荐
Hx_Ma163 小时前
SpringMVC框架提供的转发和重定向
java·开发语言·servlet
期待のcode3 小时前
原子操作类LongAdder
java·开发语言
舟舟亢亢4 小时前
Java集合笔记总结
java·笔记
小酒窝.4 小时前
【多线程】多线程打印ABC
java
乡野码圣5 小时前
【RK3588 Android12】RCU机制
java·jvm·数据库
JAVA+C语言5 小时前
如何优化 Java 多主机通信的性能?
java·开发语言·php
编程彩机6 小时前
互联网大厂Java面试:从分布式架构到大数据场景解析
java·大数据·微服务·spark·kafka·分布式事务·分布式架构
小酒窝.6 小时前
【多线程】多线程打印1~100
java·多线程
君爱学习6 小时前
基于SpringBoot的选课调查系统
java
APIshop6 小时前
Java 实战:调用 item_search_tmall 按关键词搜索天猫商品
java·开发语言·数据库