我想使用Spring Data Mongo存储库并在运行时指定文档的集合。 我找到了如何在这张票DATAMONGO-525中实现它以及我做了什么:
使用ThreadLocal变量创建GenericObject,并使用链接集合名称 这个静态变量:
@Data
@Document(collection = "#{T(com.test.myproject.model.GenericObject).getCollection()}")
public class GenericObject {
private static ThreadLocal<String> collection = new ThreadLocal<>();
@Id
private ObjectId id;
private org.bson.Document doc;
public static void setCollection(String type) {
collection.set(type);
}
public static String getCollection() {
return collection.get();
}
}
我为GenericObject创建了GenericRepository:
public interface GenericObjectRepository extends MongoRepository<GenericObject, ObjectId> {
}
所以,现在当我想从特定集合中获取/保存/删除GenericObject时,我应该在每个请求之前指定集合:
// save
GenericObject obj = new GenericObject();
GenericObject.setCollection(collectionName);
genericObjectRepository.save(obj)
...
//get
GenericObject.setCollection(collectionName);
genericObjectRepository.findById(new ObjectId(id))
.orElseThrow(() -> new RecordNotFoundException("GOS00001", id, collection));
问题是:
我的方法是线程安全的吗?有没有我没看到的问题?
SpringDataMongoDB版本: 2.0.5.RELEASE
答案 0 :(得分:0)
听起来你刚好直接使用MongoOperations就好了。为什么要担心ThreadLocal
。如果你想看到有关静态ThreadLocal用法的更多信息,你可以参考这个问题:Java ThreadLocal static?但是,你的方法很好。 ThreadLocal可以安全使用,因为不同的线程无法设置另一个线程的ThreadLocal。