spring.data.mongodb.grid-fs-database配置仅对gridfsbucket.builder().build()生效,对gridfstemplate完全无效;后者必须手动声明@bean并传入bucket名(如"tempfs")才能操作对应集合,且metadata需手动序列化、contenttype须为合法mime类型。

为什么 spring.data.mongodb.grid-fs-database 配置不生效
这个配置项只对 GridFSBucket.builder().build() 生效,对 GridFsTemplate 完全无效。Spring Boot 自动配置的 GridFsTemplate 固定绑定到 "fs" bucket,无论你改了数据库名、加了什么 property,它操作的始终是 db.fs.files 和 db.fs.chunks。想切 bucket,必须手动 new 实例并传入 bucket 名。
如何声明一个带自定义 bucket 的 GridFsTemplate Bean
不能靠配置,只能手写 @Bean,且必须显式命名,否则 @Autowired 会因类型冲突失败:
- 用
@Bean(name = "customGridFsTemplate")命名,避免和默认 bean 冲突 - 构造时第三个参数必须是 bucket 名字符串,比如
"tempFs"→ 实际操作test.tempFs.files(假设spring.data.mongodb.database=test) - 不要用
@Primary替换默认 bean,否则GridFSBucket注入会出错
示例:
@Bean(name = "tempGridFsTemplate")
public GridFsTemplate tempGridFsTemplate(MongoDbFactory mongoDbFactory, MongoConverter converter) {
return new GridFsTemplate(mongoDbFactory, converter, "tempFs");
}
contentType 参数不是文件后缀,也不能为 null
GridFsTemplate.store(InputStream, String, String, Document) 的第三个参数是 contentType,不是扩展名,也不是可选字段:
- 必须传合法 MIME 类型,如
"image/png"、"application/pdf" - 不能传
null或空字符串,否则抛IllegalArgumentException - 别传
"jpg"或".pdf"这类后缀,MongoDB 不认
metadata 字段不走 Spring Data 转换器链路
GridFsTemplate.store() 传入的 Document 会被原样写进 .files 集合的 metadata 字段,完全绕过 @WritingConverter 和 CustomConversions:
-
LocalDateTime必须手动转成字符串或毫秒值,例如:time.atZone(ZoneOffset.UTC).toInstant().toEpochMilli() - 枚举统一用
myEnum.name(),别用ordinal() - 键名不能含
.或$,否则插入直接失败 - 如果要用查询 metadata,得手动在
custom_db.tempFs.files上建索引,比如{ "metadata.createdAt": 1 }
真正容易被忽略的是:bucket 名决定集合前缀,而 metadata 序列化必须彻底脱离 Spring Data 的转换体系——这两点一旦漏掉,要么写不进数据,要么查不出来。











