JAXBContext.newInstance调用失败:待编组类位于第三方依赖包中
JAXB类转换异常解决方案
你遇到的vhu.ReqDeclaredObject$JaxbAccessorF_control cannot be cast to com.sun.xml.bind.v2.runtime.reflect.Accessor异常,核心原因是JAXB实现版本不兼容、类加载器上下文不一致:依赖包中的JAXB生成类是基于com.sun.xml.bind实现编译生成的,但当前项目运行时加载的JAXB上下文用的类加载器和依赖类的类加载器不同,或是用了命名空间不匹配的JAXB实现(比如Jakarta版的jakarta.xml.bind),导致类型强转失败。
可按优先级尝试以下解决方案:
- 方案一:显式指定JAXB上下文的类加载器
调用JAXBContext.newInstance时传入依赖类对应的类加载器,修改代码如下:
该方案无需修改依赖,改造成本最低,可优先验证。// 传入vhu包下类的类加载器初始化JAXB上下文 JAXBContext jaxbContext = JAXBContext.newInstance("vhu", vhu.ReqDeclareObject.class.getClassLoader()); Marshaller marshaller = jaxbContext.createMarshaller(); - 方案二:统一项目JAXB依赖版本
检查并对齐项目和中间API依赖的JAXB规范、实现版本:
若中间API用的是旧版javax.xml.bind命名空间的JAXB,在你的pom.xml中统一引入对应依赖:
若中间API已经迁移到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-impl</artifactId> <version>2.3.6</version> <scope>runtime</scope> </dependency>jakarta.xml.bind的依赖即可。 - 方案三:协调中间API侧调整JAXB生成参数
若可以联动中间API的维护方,可要求对方在使用xjc生成JAXB类时,添加-Xno-sun-reflection等参数,禁用生成绑定到Sun特定实现的访问器类,从根源避免强转问题。
内容的提问来源于stack exchange,提问作者Bruno Miguel
相关产品推荐
相关产品推荐

