Spring Boot部署Weblogic解析XLSX遇SchemaTypeSystemImpl类型转换异常
核心原因
Weblogic 12c自带旧版本的XMLBeans/POI相关类库,尽管配置了优先应用包,但部分OOXML(XLSX依赖)相关类仍被Weblogic系统类加载器优先加载,导致与应用内POI 5.4.0、XMLBeans 5.3.0的新版本类冲突。XLS格式依赖的HSSF组件不涉及XMLBeans,因此不受影响。
具体解决步骤
完善weblogic.xml的优先包配置
确保WEB-INF/weblogic.xml的<prefer-application-packages>覆盖所有POI和XMLBeans相关包,避免遗漏OOXML依赖的schema类:<container-descriptor> <prefer-application-packages> <!-- Apache POI核心及OOXML包 --> <package-name>org.apache.poi.*</package-name> <package-name>org.apache.poi.xssf.*</package-name> <package-name>org.apache.poi.ooxml.*</package-name> <!-- XMLBeans核心包 --> <package-name>org.apache.xmlbeans.*</package-name> <!-- OOXML依赖的schema定义包 --> <package-name>org.openxmlformats.*</package-name> <package-name>com.microsoft.schemas.*</package-name> </prefer-application-packages> </container-descriptor>强制锁定依赖版本并排除冲突传递依赖
在pom.xml中明确指定POI和XMLBeans的版本,同时排除Spring Boot或其他依赖引入的旧版类库:<!-- 强制指定POI版本 --> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>5.4.0</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>5.4.0</version> </dependency> <!-- 强制指定XMLBeans版本 --> <dependency> <groupId>org.apache.xmlbeans</groupId> <artifactId>xmlbeans</artifactId> <version>5.3.0</version> </dependency> <!-- 排除Spring Boot starter中的冲突依赖 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <exclusions> <exclusion> <groupId>org.apache.poi</groupId> <artifactId>*</artifactId> </exclusion> <exclusion> <groupId>org.apache.xmlbeans</groupId> <artifactId>*</artifactId> </exclusion> </exclusions> </dependency>验证类加载器来源
在XLSX解析代码中添加打印语句,确认类是否由应用类加载器加载:// 打印XSSFWorkbook的类加载器 System.out.println("XSSFWorkbook ClassLoader: " + XSSFWorkbook.class.getClassLoader()); // 打印XMLBeans核心类的类加载器 System.out.println("XmlObject ClassLoader: " + org.apache.xmlbeans.XmlObject.class.getClassLoader());如果输出为Weblogic系统类加载器(如
weblogic.utils.classloaders.ChangeAwareClassLoader),说明weblogic.xml配置未生效,需检查文件位置(必须在WEB-INF下)或配置格式是否有误。补充优先应用资源配置
若仍存在资源文件冲突,在weblogic.xml中添加<prefer-application-resources>:<container-descriptor> <!-- 原有prefer-application-packages配置 --> <prefer-application-resources> <resource-name>META-INF/services/org.apache.xmlbeans.XmlErrorHandler</resource-name> <resource-name>org/openxmlformats/schemas/**</resource-name> <resource-name>com/microsoft/schemas/**</resource-name> </prefer-application-resources> </container-descriptor>
额外注意
POI 5.4.0官方支持Java 8,但需确保项目中无其他依赖引入与XMLBeans 5.3.0冲突的组件(如高版本ASM),可通过mvn dependency:tree命令排查依赖树。
内容的提问来源于stack exchange,提问作者Sid

