这是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时,属性提供程序没有正确配置。为什么会这样?我该怎么做才能让房产到位?
答案 0 :(得分:0)
我认为上述错误是因为SpEL表达式。您可以尝试这种方式使用下面的SpEL表达式访问TenantProvider类。
#{T(TenantProvider).getTenantCollectionName('Metric')}
或者您可以在上面的表达式中为TenantProvider添加一个完全限定的类名。