首页 > 编程语言 >spring boot使用Jwt令牌时出现 java.lang.NoClassDefFoundError: javax/xml/bind/DatatypeConverter 异常

spring boot使用Jwt令牌时出现 java.lang.NoClassDefFoundError: javax/xml/bind/DatatypeConverter 异常

时间:2024-12-19 17:31:51浏览次数:7  
标签:lang xml bind Base64 JJWT API 版本 DatatypeConverter

问题根源

       在 Java 9 及更高版本中,Java 平台经历了模块化系统(Jigsaw 项目)的重大变化。作为这一变化的一部分,某些 API 被移出了默认的 JDK 发行版,其中包括 JAXB (Java Architecture for XML Binding) API。因此,在使用这些被移除的 API 时,如果应用程序或库没有适当地包含它们,就会抛出 ClassNotFoundExceptionNoClassDefFoundError 异常。

  javax.xml.bind.DatatypeConverter 是一个属于 JAXB API 的类,它通常用于 XML 数据绑定,但在较新的 Java 版本中不再默认可用。你的堆栈跟踪显示,这个类正被 io.jsonwebtoken 库用来进行 Base64 编解码操作。由于你使用的 JJWT 版本依赖于这个类,所以当你运行程序时,就遇到了 ClassNotFoundException

解决方案

1. 添加 JAXB 依赖

对于 Maven 项目:

       如果你使用的是 Maven 构建工具,可以通过修改 pom.xml 文件来添加必要的依赖项。你需要确保项目能够访问 JAXB API 和它的实现。这里提供了两个依赖项,分别是 API 和运行时:

<dependencies>
    <!-- JAXB API -->
    <dependency>
        <groupId>javax.xml.bind</groupId>
        <artifactId>jaxb-api</artifactId>
        <version>2.3.1</version>
    </dependency>

    <!-- JAXB Runtime -->
    <dependency>
        <groupId>org.glassfish.jaxb</groupId>
        <artifactId>jaxb-runtime</artifactId>
        <version>2.3.1</version>
    </dependency>
</dependencies>

对于 Gradle 项目:

      如果你使用的是 Gradle 构建工具,可以在 build.gradle 文件中添加如下依赖:

dependencies {
    implementation 'javax.xml.bind:jaxb-api:2.3.1'
    implementation 'org.glassfish.jaxb:jaxb-runtime:2.3.1'
}

注意事项:

  • 确保选择与你的应用程序兼容的版本。
  • 如果你在 Spring Boot 项目中工作,Spring Boot 可能有自己的依赖管理策略,所以请检查是否有覆盖或冲突的情况。
2. 更新 JJWT 库

       旧版本的 JJWT 可能直接依赖于 javax.xml.bind.DatatypeConverter 来处理 Base64 编解码。新版本的 JJWT 已经解决了这个问题,它们不再依赖于已废弃的类,并且有独立的方法来进行 Base64 编解码。

        你可以通过访问 JJWT GitHub 页面 获取最新版本的信息。按照官方文档更新到最新的稳定版本,并根据需要调整代码以适应任何API变更。

具体步骤:

  1. 检查当前项目的 JJWT 版本。
  2. 访问 JJWT GitHub 仓库,找到最新发布的版本号。
  3. 修改项目的构建文件(Maven 的 pom.xml 或 Gradle 的 build.gradle),将 JJWT 依赖更新为最新版本。
  4. 如果升级后有任何不兼容的变化,请参考迁移指南进行必要的代码调整。
  5. 测试应用,确保一切正常工作。
3. 使用替代方法

     如果你暂时无法升级 JJWT 或者不想引入额外的依赖,可以考虑修改代码,用其他方式实现 Base64 编解码。例如,可以直接使用 Java 8 引入的标准库中的 java.util.Base64 类来进行编解码。

具体步骤:

  1. 找到所有调用 DatatypeConverter.printBase64Binary 和 DatatypeConverter.parseBase64Binary 的地方。
  2. 替换为 java.util.Base64 提供的等效方法:
import java.util.Base64;

// 替代 DatatypeConverter.printBase64Binary
String encoded = Base64.getEncoder().encodeToString(bytes);

// 替代 DatatypeConverter.parseBase64Binary
byte[] decoded = Base64.getDecoder().decode(encodedString);
  1. 对修改后的代码进行全面测试,确保功能正确无误。
  2. 如果你正在使用第三方库并且不能修改其源代码,则需要寻找该库的更新版本或者联系开发者请求支持。

总结

       为了彻底解决问题,建议优先尝试更新 JJWT 库至最新版本,因为这是最直接也是最持久的解决方案。如果出于某种原因无法这样做,那么添加 JAXB 依赖或者替换 Base64 编解码逻辑都是有效的备选方案。无论采取哪种方法,都应确保对改动后的代码进行了充分的测试,以保证系统的稳定性。

标签:lang,xml,bind,Base64,JJWT,API,版本,DatatypeConverter
From: https://blog.csdn.net/m0_50742275/article/details/144590509

相关文章

  • [深入探讨 Google Cloud SQL for PostgreSQL 的使用:Langchain 集成]
    文章目录概要整体架构流程技术名词解释技术细节小结概要提示:这里可以添加技术概要例如:openAI的GPT大模型的发展历程。整体架构流程提示:这里可以添加技术整体架构例如:在语言模型中,编码器和解码器都是由一个个的Transformer组件拼接在一起形成的。技术......
  • MyBatis 中的映射器配置:XML 与注解开发的对比与选择
    MyBatis中的映射器配置:XML与注解开发的对比与选择在MyBatis开发中,映射器(Mapper)是连接数据库和Java对象的核心组件。MyBatis提供了两种主要的映射器配置方式:基于XML的映射文件和基于注解的开发。本文将详细介绍这两种方式的使用场景、配置方法以及它们的优缺点,帮助你在实......
  • 你的语言模型实际是一个奖励模型!Direct Preference Optimization:Your Language Model
    直接偏好优化:你的语言模型实际上是一个奖励模型......
  • Mybatis 升级 Mybatis Plus 重写 Mybatis Plus selectList,如果将参数传到 Mapp.xml
    目录Mybatis写法EntityMapperServiceMapper.xmlTestMybatisPlusEntityMapperServiceMapper.xmlTestMybatis升级MybatisPlus将实体做为条件参数带到Mapp.xml中的自定义SQLMybatis写法通过pagehelper进行分页EntitypublicclassActivityTrackingimplementsSeri......
  • Java-30 深入浅出 Spring - IoC 基础 启动IoC 纯XML启动 Bean、DI注入
    点一下关注吧!!!非常感谢!!持续更新!!!大数据篇正在更新!https://blog.csdn.net/w776341482/category_12713819.html目前已经更新到了:MyBatis(已更完)Spring(正在更新…)上节进度上节我们完成了启动IoC容器的部分。下面我们续接上节的内容,继续后续的内容。纯XML模式采用S......
  • 微服务的终极 Golang 框架:GoFr
    微服务的终极Golang框架:GoFr原创 南丞 PFinalClub  2024年12月18日13:18 上海PFinalClub一个有信念者所开发出的力量,大于99个只有兴趣者。113篇原创内容公众号微服务的终极Golang框架:GoFr前言Go语言因其出色的并发处理能力和简洁的语法,成......
  • 探索LangChain与LangGraph:从入门到进阶的LLM应用开发指南
    探索LangChain与LangGraph:从入门到进阶的LLM应用开发指南在当今的技术发展浪潮中,语言模型(LLM)的应用变得越来越普遍。无论是构建聊天机器人还是数据分析系统,LLM无疑提供了强大的支持。本文将引导您从LangChain的基础入手,逐步探索构建LLM应用程序的实际案例和技术细节,最后为......
  • 在MAT中使用OQL(Object Query Language)根据关键词查找对象
    在MAT中使用OQL(ObjectQueryLanguage)根据关键词查找对象,可以遵循以下步骤:1.**打开OQLConsole**:在MAT中,你可以通过菜单栏中的“Query”->“OpenOQLConsole”或者使用快捷键`Ctrl+Alt+O`来打开OQL控制台。2.**编写OQL查询**:使用OQL的SELECT、FROM、WHERE子句来构建......
  • XPath用于在XML和HTML文档中提取和操作数据
    一、概述XPath(XMLPathLanguage)是一门在XML文档中查找信息的语言,它也可用于HTML文档,因为HTML可以看作是XML的一种特殊形式。XPath通过路径表达式来选取XML/HTML文档中的节点或者节点集。二、节点类型在XPath中,有多种节点类型,主要包括以下几种:元素节点:这是最常见的节点类型,例......
  • 【bWAPP】XML&XPath Injection实战
    人生最大的悲剧就是:你配不上自己的野心,也辜负了所受的苦难前言XML注入XXE-“xmlexternalentityinjection”,即“xml外部实体注入漏洞”。概括一下就是"攻击者通过向服务器注入指定的xml实体内容,从而让服务器按照指定的配置进行执行,导致问题"也就是说服务端接收......