@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

回到顶部