如何为Camel Core XML解析器启用AccessExternalSchema
解决Camel 3.21+ Spring XML路由的accessExternalSchema禁用问题
以下是几种重新启用外部Schema访问或规避限制的可行方案:
1. 全局系统属性配置
直接通过JVM启动参数设置XML解析器的外部访问权限,这是最快捷的全局方案:
-Djavax.xml.accessExternalSchema=file
如果需要允许所有类型的外部访问(不推荐生产环境),可以设置为*:
-Djavax.xml.accessExternalSchema=*
注意:该参数会影响整个JVM内的XML解析行为,需评估全局影响。
2. 自定义Camel XML解析器配置
通过Spring扩展自定义Camel的XML解析逻辑,针对性开启权限:
- 创建一个
BeanPostProcessor,拦截Camel的XmlParser相关Bean,修改其SchemaFactory配置:
import org.apache.camel.spring.xml.XmlParser; import org.springframework.beans.BeansException; import org.springframework.beans.factory.config.BeanPostProcessor; import org.springframework.stereotype.Component; import javax.xml.XMLConstants; import javax.xml.validation.SchemaFactory; @Component public class CamelXmlParserPostProcessor implements BeanPostProcessor { @Override public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { if (bean instanceof XmlParser) { XmlParser parser = (XmlParser) bean; SchemaFactory schemaFactory = parser.getSchemaFactory(); schemaFactory.setProperty(XMLConstants.ACCESS_EXTERNAL_SCHEMA, "file"); } return bean; } }
- 将该类注册到Spring容器中,Camel初始化时会自动应用配置。
3. 迁移XSD到Classpath(推荐)
如果允许修改XML中的Schema引用,将so.xsd文件放到项目的src/main/resources目录下,然后修改XML中的schemaLocation:
xsi:schemaLocation="http://example.com/so classpath:so.xsd"
这种方式不需要开启外部文件访问,更符合Camel 3.21+的安全默认策略,同时避免了全局配置的风险。
内容的提问来源于stack exchange,提问作者Devin Lewis
相关产品推荐
相关产品推荐

