【问题标题】:MongoTemplate in MultiTenant Spring Data Mongo Application多租户 Spring Data Mongo 应用程序中的 MongoTemplate
【发布时间】:2017-08-18 18:54:25
【问题描述】:

这是对问题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 时,属性提供者没有正确配置。为什么会这样?我该怎么做才能让物业到位?

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2013-03-21
      • 2015-01-10
      • 1970-01-01
      • 2022-11-18
      • 2014-04-19
      • 1970-01-01
      • 2019-10-14
      • 2017-03-05
      • 2019-06-12
      相关资源
      最近更新 更多