Spring版本: 5.3.x
问题描述
在测试Spring Bean工厂加载XML文件的时候,报出如下异常:
1 | log复制代码Passed-in Resource [InputStream resource [resource loaded through InputStream]] contains an open stream: cannot determine validation mode automatically. Either pass in a Resource that is able to create fresh streams, or explicitly specify the validationMode on your XmlBeanDefinitionReader instance. |
先贴出源码:
1 | xml复制代码@Test |
问题分析
- 直接原因:
org.springframework.beans.factory.xml.XmlBeanDefinitionReader#detectValidationMode
方法进行验证模式检测时,首先会检查Resource
的idOpen()
,如果返回的是 true, 则会抛出上述的BeanDefinitionStoreException
异常。
1 | java复制代码protected int detectValidationMode(Resource resource) { |
- 根本原因
isOpen()
的值是Resource
实现本身写定的,我们使用的InputStreamResource
刚好定义的是true, 故而报出此异常。
1 | java复制代码public boolean isOpen() { |
解决方案
其实问题的解决方案在InputStreamResource
中已经注释出来了。
1 | scss复制代码给定InputStream Resource实现。 |
而相关的实现有很多, 如下列出的:
1 | markdown复制代码* WritableResource |
最终的代码:
1 | scss复制代码@Test |
本文转载自: 掘金