MultiTenant Spring Data Mongo应用程序中的MongoTemplate

时间:2017-08-18 18:54:25

标签: spring spring-data spring-data-mongodb

这是Making spring-data-mongodb multi-tenant问题的后续问题 Oliver Gierke解释了如何为SpringDataMongo应用程序设置多租户的选项。我遵循他的“收集方法”并且非常成功。至今。当我想自定义使用的MongoTemplate时出现问题。看看这个例子:

@SpringBootApplication
public class MultiTenantMongoApplication {

    public static void main(String[] args) {
        SpringApplication.run(MultiTenantMongoApplication.class, args);
    }

    @Bean
    public MongoTemplate mongoTemplate(Mongo mongo, @Value("${random.name}") String randomName) throws Exception {
        String dbname = "db_" + randomName;
        MongoTemplate mongoTemplate = new MongoTemplate(mongo, dbname) {
            @SuppressWarnings("unused")
            public void shutdown() {
                mongo.dropDatabase(dbname);
            }
        };
        return mongoTemplate;
    }
}

@Document(collection="#{tenantProvider.getTenantCollectionName('Metric')}")
public class Metric {

}

@Repository
public interface MetricRepository extends MongoRepository<Metric, ObjectId>{}

@Component
public class TenantProvider {
    public String getTenantCollectionName(String collectionName) {
        ...
    }
}

这会产生以下错误:

  

SpelEvaluationException:EL1007E:属性或字段'tenantProvider'   在null

上找不到

当我在应用程序类中删除MongoTemplate bean的定义时,一切都很好并按需运行。 显然,在定制MongoTemplate时,属性提供程序没有正确配置。为什么会这样?我该怎么做才能让房产到位?

1 个答案:

答案 0 :(得分:0)

我认为上述错误是因为SpEL表达式。您可以尝试这种方式使用下面的SpEL表达式访问TenantProvider类。

#{T(TenantProvider).getTenantCollectionName('Metric')}

或者您可以在上面的表达式中为TenantProvider添加一个完全限定的类名。