2017-08-18 40 views
0

这是后续问题Making spring-data-mongodb multi-tenant Oliver Gierke解释了如何为SpringDataMongo应用程序设置多租户的选项。我遵循他的“收集方法”,并且非常成功。至今。出现问题时,我想自定义使用的MongoTemplate。对此例子看看:MultiTenant Spring Data Mongo应用程序中的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: Property or field 'tenantProvider' cannot be found on null

当我删除应用程序类的一切MongoTemplate bean的定义是罚款和运行任意的。 当MongoTemplate被自定义时,显然属性提供者得不到适当的配置。这是为什么发生?我能做些什么来获得财产?

回答

0

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

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

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

+0

不,不会改变一件事 – Gregor

相关问题