执行Spring Batch出现SAXParseException无法读取xsd报错如何永久解决
报错触发原因
这个SAXParseException警告是Spring加载XML配置文件时,XSD Schema校验资源拉取失败导致的,具体触发逻辑如下:
- Spring默认会优先从线上官方地址拉取对应XSD文件做配置校验,当网络环境存在防火墙限制、波动、或者官方地址临时不可达时,就会抛出该拉取失败警告。
- 重试后程序可以正常执行,是因为Spring内置了降级逻辑:线上拉取XSD失败后,会自动从本地引入的spring-beans等相关Jar包中读取对应版本的内置XSD文件完成校验,所以不会影响最终启动。
- 少部分场景是XML配置中写的XSD版本号和本地引入的Spring依赖版本不匹配,导致版本对应不上拉取失败,这种场景通常会直接启动失败,不会重试成功。
永久修复方案
方案1:将XSD引用改为本地Classpath路径(最推荐)
直接指定从本地Jar包读取XSD,完全跳过网络拉取步骤,从根源避免网络问题导致的警告。
修改XML配置的schemaLocation属性即可,示例如下:
原配置:
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
修改后:
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans classpath:org/springframework/beans/factory/xml/spring-beans.xsd">
你项目中用到的其他Spring模块XSD(比如batch、context、tx等)都可以按照该规则修改,路径对应对应Spring模块Jar包中的XSD文件路径即可。
方案2:对齐Spring依赖版本和XSD版本
如果你不想改引用路径,确保XML配置中XSD的版本和本地引入的Spring核心依赖版本完全一致,不要出现依赖用5.3.x版本,XSD写4.2.x版本的情况,直接写不带版本号的XSD地址即可,Spring会自动匹配当前依赖对应的版本。
方案3:关闭XML配置校验(不推荐)
如果不需要XML配置校验能力,可以直接关闭校验彻底去掉该警告,代码配置示例:
XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(beanFactory); reader.setValidationMode(XmlBeanDefinitionReader.VALIDATION_NONE);
也可以在XML头部添加validation-mode="NONE"属性实现关闭。
内容的提问来源于stack exchange,提问作者One Developer
相关产品推荐
相关产品推荐

