You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修复Java17+SpringBoot3中DatatypeConverter的NoClassDefFoundError

问题原因

Java 17 已移除 javax.xml.bind 相关API,且Spring Boot 3全面迁移至Jakarta EE规范,原javax.*包已替换为jakarta.*。你的JWT生成逻辑中若使用了javax.xml.bind.DatatypeConverter(通常用于Base64编解码或日期转换),就会触发NoClassDefFoundError。

修复方案

方案1:替换DatatypeConverter为Java原生API

如果是你自己的代码中直接调用了DatatypeConverter,可以用Java 8+自带的工具类替代:

Base64编解码替换

原代码:

import javax.xml.bind.DatatypeConverter;

// 编码
String encodedStr = DatatypeConverter.printBase64Binary(byteData);
// 解码
byte[] decodedData = DatatypeConverter.parseBase64Binary(encodedStr);

替换为:

import java.util.Base64;

// 编码
String encodedStr = Base64.getEncoder().encodeToString(byteData);
// 解码
byte[] decodedData = Base64.getDecoder().decode(encodedStr);

日期转换替换

如果用DatatypeConverter处理日期,替换为Java 8+的java.time API:
原代码:

import javax.xml.bind.DatatypeConverter;
Date date = DatatypeConverter.parseDateTime(dateStr).getTime();
String dateStr = DatatypeConverter.printDateTime(new GregorianCalendar());

替换为:

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Date;
import java.time.ZoneId;

// 字符串转Date
LocalDateTime localDateTime = LocalDateTime.parse(dateStr, DateTimeFormatter.ISO_DATE_TIME);
Date date = Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant());

// Date转字符串
LocalDateTime now = LocalDateTime.now();
String dateStr = now.format(DateTimeFormatter.ISO_DATE_TIME);

方案2:升级JWT依赖库(若使用第三方JWT框架)

如果你的JWT生成依赖第三方库(比如JJWT),旧版本可能仍依赖javax.xml.bind,需升级到支持Spring Boot 3和Java 17的版本:
以JJWT为例,Maven依赖配置如下:

<dependency>
    <groupId>io.jsonwebtoken</groupId>
    <artifactId>jjwt-api</artifactId>
    <version>0.11.5</version>
</dependency>
<dependency>
    <groupId>io.jsonwebtoken</groupId>
    <artifactId>jjwt-impl</artifactId>
    <version>0.11.5</version>
    <scope>runtime</scope>
</dependency>
<dependency>
    <groupId>io.jsonwebtoken</groupId>
    <artifactId>jjwt-jackson</artifactId>
    <version>0.11.5</version>
    <scope>runtime</scope>
</dependency>

该版本已移除对javax.xml.bind的依赖,全面适配Jakarta EE规范。

不推荐的临时方案:添加javax.xml.bind依赖

若因特殊场景需保留原代码,可临时添加以下依赖,但长期来看会存在Jakarta EE兼容性风险:

<dependency>
    <groupId>javax.xml.bind</groupId>
    <artifactId>jaxb-api</artifactId>
    <version>2.3.1</version>
</dependency>
<dependency>
    <groupId>com.sun.xml.bind</groupId>
    <artifactId>jaxb-core</artifactId>
    <version>2.3.0.1</version>
</dependency>
<dependency>
    <groupId>com.sun.xml.bind</groupId>
    <artifactId>jaxb-impl</artifactId>
    <version>2.3.3</version>
</dependency>

内容的提问来源于stack exchange,提问作者David

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 10:35:15