Spring @Value注解读取classpath资源时通配符使用规则疑问
Spring @Value资源注入通配符规则说明
通配符支持规则
Spring资源路径匹配采用Ant风格规则,并非仅支持单个星号,共支持三类通配符:
?:匹配单个任意字符,不包含目录分隔符/*:匹配0个或多个任意字符,不包含目录分隔符/,仅可匹配同一层级目录下的资源,也就是你常用的根目录批量匹配写法的逻辑**:匹配0个或多个层级的目录,必须作为路径中独立的片段使用,不支持和其他字符拼接在同一路径段(例如a**b.json属于无效写法)
多层通配符生效要求
你之前写的**/**/*.json不生效主要是两个原因:
- 前缀配置错误:仅使用
classpath:前缀时,默认仅匹配当前类加载器的根路径资源,如果通配符出现在路径开头,仅会扫描当前模块编译后的classes目录,不会扫描依赖Jar包内的资源。如果需要全类路径扫描,需要改用classpath*:前缀。如果是匹配指定根目录下的多层资源,也可以保留classpath:前缀,比如classpath:config/**/*.json可以正常匹配当前类路径config目录下所有层级的json文件。 - 通配符冗余:多层连续的
**/属于无效冗余写法,Spring路径解析时会出现匹配逻辑异常,匹配任意层级下的.json文件仅需要写**/*.json即可。
正确的多层资源注入示例
如果要读取全类路径下所有层级的json文件,写法如下:
@Value("classpath*:**/*.json") private Resource[] allJsonFiles;
内容的提问来源于stack exchange,提问作者mdave16
相关产品推荐
相关产品推荐

