7

これは 、@Document アノテーションの MongoDB および SpEL 式に関連しています。

これは、私のmongoテンプレートを作成する方法です

@Bean
public MongoDbFactory mongoDbFactory() throws UnknownHostException {
    String dbname = getCustid();
    return new SimpleMongoDbFactory(new MongoClient("localhost"), "mydb");
}

@Bean
MongoTemplate mongoTemplate() throws UnknownHostException {
    MappingMongoConverter converter = 
            new MappingMongoConverter(mongoDbFactory(), new MongoMappingContext());
    return new MongoTemplate(mongoDbFactory(), converter);
}

テナント プロバイダー クラスがあります

@Component("tenantProvider")
public class TenantProvider {

    public String getTenantId() {
      --custome Thread local logic for getting a name
    }
}

そして私のドメインクラス

    @Document(collection = "#{@tenantProvider.getTenantId()}_device")
     public class Device {
    -- my fields here
    }

ご覧のとおり、投稿で指定されているようにmongotemplateを作成しましたが、それでも以下のエラーが発生します

スレッド「メイン」org.springframework.expression.spel.SpelEvaluationException での例外: EL1057E:(pos 1): Bean 'tenantProvider' へのアクセスを解決するコンテキストに Bean リゾルバーが登録されていません

私は何を間違っていますか?

4

3 に答える 3

11

最後に、なぜこの問題が発生したのかを理解しました。

サーブレット 3 の初期化を使用する場合は、次のようにアプリケーション コンテキストを mongo コンテキストに追加してください。

    @Autowired
private ApplicationContext appContext;

public MongoDbFactory mongoDbFactory() throws UnknownHostException {
    return new SimpleMongoDbFactory(new MongoClient("localhost"), "apollo-mongodb");
}

@Bean
MongoTemplate mongoTemplate() throws UnknownHostException {
    final MongoDbFactory factory = mongoDbFactory();

    final MongoMappingContext mongoMappingContext = new MongoMappingContext();
    mongoMappingContext.setApplicationContext(appContext);

    // Learned from web, prevents Spring from including the _class attribute
    final MappingMongoConverter converter = new MappingMongoConverter(factory, mongoMappingContext);
    converter.setTypeMapper(new DefaultMongoTypeMapper(null));

    return new MongoTemplate(factory, converter);
}

コンテキストの自動配線と mongoMappingContext.setApplicationContext(appContext);も確認してください。

これらの 2 行で、コンポーネントを正しく配線して、マルチテナント モードで使用することができました。

于 2014-01-10T13:19:57.407 に答える