@Document批注中的MongoDB和SpEL表达式
我正在尝试使用SpEL根据我定义的一些规则将同一文档加载到不同的集合中。
因此,从我所拥有的开始:
-首先文件:
@Document(collection = "#{@mySpecialProvider.getTargetCollectionName()}")public class MongoDocument {
// some random fields go in
}
-秒我有应该提供集合名称的提供者bean:
@Component("mySpecialProvider")public class MySpecialProvider {
public String getTargetCollectionName() {
// Thread local magic goes in bellow
String targetCollectionName = (String) RequestLocalContext.getFromLocalContext("targetCollectionName");
if (targetCollectionName == null) {
targetCollectionName = "defaultCollection";
}
return targetCollectionName;
}
}
问题是,当我尝试将文档插入应由提供程序生成的特定集合中时,我得到以下stacktrace:
我也尝试制作Spring组件 但还是没有运气。
回答:
如我所言,我将回答我的问题。要使其正常工作,您需要在应用程序上下文XML文件中对 bean进行以下设置:
<mongo:db-factory dbname="${myDatabaseName.from.properties.file}" mongo-ref="mongo"/><bean id="mongoMappingContext" class="org.springframework.data.mongodb.core.mapping.MongoMappingContext"/>
<bean id="mappingMongoConverter" class="org.springframework.data.mongodb.core.convert.MappingMongoConverter" c:mongoDbFactory-ref="mongoDbFactory"
c:mappingContext-ref="mongoMappingContext"/>
<bean id="mongoTemplate" class="org.springframework.data.mongodb.core.MongoTemplate"
c:mongoDbFactory-ref="mongoDbFactory" c:mongoConverter-ref="mappingMongoConverter"/>
并使用上面的设置和我在问题中建议的解决方案。您可以使用相同的域对象,并根据您选择的设置将其存储到多个集合中。
由于有人在相关问题中提出了要求,因此我还将在这里更新ThreadLocal上下文的逻辑:
创建一个 类,该类包装以下实现:
private static final ThreadLocal<Map> CONTEXT = new ThreadLocal<Map>() { protected Map initialValue() {
Map localMap = new HashMap();
localMap.put(LocalContextKeys.CONVERSATION_CONTEXT, new HashMap());
return localMap;
};
};
public static void putInLocalContext(Object key, Object value) {
Map localMap = CONTEXT.get();
localMap.put(key, value);
}
public static Object getFromLocalContext(Object key) {
Map localMap = CONTEXT.get();
return localMap.get(key);
}
其中 是一个枚举,其中包含 上下文
允许的键。请注意,这些键是用户定义的,因此可以随意将其放置在其中。
以上是 @Document批注中的MongoDB和SpEL表达式 的全部内容, 来源链接: utcz.com/qa/415495.html