2

定義したいくつかのルールに基づいて、SpEL を使用して同じドキュメントを別のコレクションにロードしようとしています。

だから私が持っているものから始める:

-まず最初にドキュメント:

@Document(collection = "#{@mySpecialProvider.getTargetCollectionName()}")
public class MongoDocument {
// some random fields go in
}

-second コレクション名を提供するプロバイダー 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;
 }
}

問題は、プロバイダーによって生成される特定のコレクションにドキュメントを挿入しようとすると、次のスタック トレースが表示されることです。

org.springframework.expression.spel.SpelEvaluationException: EL1057E:(pos 1): Bean 'mySpecialProvider' へのアクセスを解決するコンテキストに Bean リゾルバーが登録されていません

また、春のコンポーネントApplicationContextAwareを作成しようとしましたが、まだ運がありません。

4

2 に答える 2

4

私が約束したように、私は私の質問に答えて戻ってきます。これを機能させるには、アプリケーション コンテキスト XML ファイルでmongoTemplate 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 コンテキストのロジックも更新します。

次の実装をラップするRequestLocalContextクラスを作成します。

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);
}

LocalContextKeysはThreadLocalコンテキストMapで許可されているキーを含む列挙型です。キーはユーザー定義であるため、必要なものを自由に入力してください。

于 2013-08-12T07:24:22.750 に答える
1

代わりに mongo テンプレートのメソッドを使用できます: save(Object objectToSave, String collectionName)。

于 2013-08-10T13:11:14.787 に答える