在打开下载流时会先使用下面这段代码获取文档是否存在。
ridFSFile gridFsFile = gridFsTemplate.findOne(Query.query(Criteria.where("_id").is(id)));
在经过我的排查,我发现这个文档的id是存在的。
我再看我的GridFSDownloadStream的代码,我的文档肯定是存在,但是它就是说我不存在。
GridFSDownloadStream downloadStream = gridFsBucket.openDownloadStream(gridFsFile.getObjectId());
我想着可能是我的gridFsBucket的问题。随后我就查看GridFSDownloadStream这个的用法,我发现,这个GridFSBucket在实例化的时候是需要传入参数的。然后我就想到我设置了储存桶,会不会是我设置了储存桶,它在找我的文档的时候与gridFsTemplate不在同一个储存桶导致在使用gridFsTemplate时找到了,后面使用gridFsBucket时没有找到。
然后我就在springboot给GridFSBucket注入的时候指定注入方法,结果成功。
@Bean(name = "xx1")
public GridFSBucket getUnityModelGridFSBucket(MongoClient client){
MongoDatabase database = client.getDatabase(db);
GridFSBucket gridFSBucket = GridFSBuckets.create(database, "xx1");
return gridFSBucket;
}
@Bean(name="xx1GridFsTemplate")
public GridFsTemplate unityModelTemplate(SimpleMongoClientDatabaseFactory dbFactory, MongoConverter converter) {
return new GridFsTemplate(dbFactory, converter, "xx1");
}
@Resource(name = "xx1GridFsTemplate")
GridFsTemplate gridFsTemplate;
@Resource(name = "xx1")
GridFSBucket gridFsBucket;