升级Spring Boot3.3.0后docx4j-JAXB-MOXy的JAXB上下文异常求助
解决docx4j-JAXB-MOXy与Spring Boot 3.3.0的JAXB上下文冲突问题
以下是几种无需回退jakarta.xml.bind-api版本的解决方案:
1. 强制指定MOXy为JAXB上下文工厂
Spring Boot 3.3.0默认关联Glassfish的JAXB实现,显式配置让系统优先使用MOXy:
- 在配置文件中添加:
spring.jaxb.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory - 或者代码中手动创建上下文时指定工厂:
import jakarta.xml.bind.JAXBContext; import org.eclipse.persistence.jaxb.JAXBContextFactory; // 示例:针对docx4j相关类创建上下文 JAXBContext context = JAXBContext.newInstance( "org.docx4j.wml", Thread.currentThread().getContextClassLoader(), Map.of(JAXBContextFactory.DEFAULT_JAXB_CONTEXT_FACTORY, "org.eclipse.persistence.jaxb.JAXBContextFactory") );
2. 排除Spring Boot默认引入的Glassfish JAXB依赖
在构建文件中排除Spring Boot自动引入的Glassfish JAXB运行时,避免与MOXy冲突:
Maven配置:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> <exclusions> <exclusion> <groupId>org.glassfish.jaxb</groupId> <artifactId>jaxb-runtime</artifactId> </exclusion> </exclusions> </dependency>
Gradle配置:
dependencies { implementation('org.springframework.boot:spring-boot-starter') { exclude group: 'org.glassfish.jaxb', module: 'jaxb-runtime' } }
3. 确保MOXy版本适配jakarta.xml.bind-api 4.0.2
jakarta.xml.bind-api 4.x对应Jakarta EE 10,需要使用4.0.0及以上版本的MOXy,显式引入适配版本:
<dependency> <groupId>org.eclipse.persistence</groupId> <artifactId>org.eclipse.persistence.moxy</artifactId> <version>4.0.2</version> </dependency>
同时确认docx4j版本支持该MOXy版本,避免跨版本兼容性问题。
4. 手动初始化并注入MOXy上下文到docx4j
绕过docx4j自带的Context类,手动创建MOXy上下文并设置为docx4j的全局上下文:
import org.docx4j.jaxb.Context; import org.eclipse.persistence.jaxb.JAXBContextFactory; import jakarta.xml.bind.JAXBException; // 在应用启动阶段执行 public void initDocx4jMoxyContext() { try { // 创建针对docx4j核心类的MOXy上下文 var moxyContext = JAXBContextFactory.createContext( new Class[]{org.docx4j.wml.Document.class}, null ); Context.setJAXBContext(moxyContext); } catch (JAXBException e) { // 处理初始化异常 e.printStackTrace(); } }
内容的提问来源于stack exchange,提问作者BenHT
相关产品推荐
相关产品推荐

