Spring Boot构建JWT令牌时出现DatatypeConverter类未找到异常如何解决
异常产生原因
你使用的jjwt 0.9.1版本依赖javax.xml.bind.DatatypeConverter类实现Base64编码,该类属于JAXB模块:
- Java 8及更低版本中,JAXB模块是JDK默认内置的,不会出现该异常
- Java 9及更高版本中,JDK移除了默认内置的JAXB模块,运行时找不到对应类就会抛出
NoClassDefFoundError
解决方案
方案一:保留jjwt 0.9.1版本,手动补充JAXB依赖
Maven项目在pom.xml中添加以下依赖:
<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-impl</artifactId> <version>2.3.1</version> <scope>runtime</scope> </dependency> <dependency> <groupId>com.sun.xml.bind</groupId> <artifactId>jaxb-core</artifactId> <version>2.3.0.1</version> </dependency> <dependency> <groupId>javax.activation</groupId> <artifactId>activation</artifactId> <version>1.1.1</version> </dependency>
Gradle项目在build.gradle中添加:
implementation 'javax.xml.bind:jaxb-api:2.3.1' runtimeOnly 'com.sun.xml.bind:jaxb-impl:2.3.1' implementation 'com.sun.xml.bind:jaxb-core:2.3.0.1' implementation 'javax.activation:activation:1.1.1'
方案二(推荐):升级jjwt到最新稳定版
jjwt从0.10.0版本开始就移除了对JAXB的依赖,自身实现了编解码逻辑,无需额外引入JAXB包,适配所有Java 8及以上版本。
Maven引入新版jjwt依赖如下:
<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>
升级后原有生成、解析JWT的代码逻辑不需要改动,可直接兼容。
内容的提问来源于stack exchange,提问作者AndreaNobili
相关产品推荐
相关产品推荐

