@EnableMongoAuditing for Cloud Foundry / mongolab上的MongoDB

时间:2015-07-12 12:22:49

标签: mongodb cloudfoundry spring-data-mongodb

我的设置适用于我的本地,但不是在我将其部署到CloudFoundry / mongolab时。

配置与docs非常相似。

我当地的春季配置

@Configuration
@Profile("dev")
@EnableMongoAuditing
@EnableMongoRepositories(basePackages = "com.foo.model")
public class SpringMongoConfiguration extends AbstractMongoConfiguration {

@Override
protected String getDatabaseName() {
    return "myDb";
}

@Override
public Mongo mongo() throws Exception {
    return new MongoClient("localhost");
}

@Bean
public AuditorAware<User> myAuditorProvider() {
    return new SpringSecurityAuditorAware();
}

}

这是云代工厂设置

@Configuration
@Profile("cloud")
@EnableMongoAuditing
@EnableMongoRepositories(basePackages = "com.foo.model")
public class SpringCloudMongoDBConfiguration extends AbstractMongoConfiguration {

private Cloud getCloud() {
    CloudFactory cloudFactory = new CloudFactory();
    return cloudFactory.getCloud();
}

@Bean
public MongoDbFactory mongoDbFactory() {
    Cloud cloud = getCloud();
    MongoServiceInfo serviceInfo = (MongoServiceInfo) cloud.getServiceInfo(cloud.getCloudProperties().getProperty("cloud.services.mongo.id"));
    String serviceID = serviceInfo.getId();
    return cloud.getServiceConnector(serviceID, MongoDbFactory.class, null);
}

@Override
protected String getDatabaseName() {
    Cloud cloud = getCloud();
    return cloud.getCloudProperties().getProperty("cloud.services.mongo.id");
}

@Override
public Mongo mongo() throws Exception {
    Cloud cloud = getCloud();
    return new MongoClient(cloud.getCloudProperties().getProperty("cloud.services.mongo.connection.host"));
}

@Bean
public MongoTemplate mongoTemplate() {
    return new MongoTemplate(mongoDbFactory());
}

@Bean
public AuditorAware<User> myAuditorProvider() {
    return new SpringSecurityAuditorAware();
}

}

我尝试在Cloud Foundry中保存文档时遇到的错误是:

OUT ERROR: org.springframework.data.support.IsNewStrategyFactorySupport - Unexpected error
OUT java.lang.IllegalArgumentException: Unsupported entity com.foo.model.project.Project! Could not determine IsNewStrategy.
OUT at org.springframework.data.mongodb.core.MongoTemplate.insert(MongoTemplate.java:739)
OUT at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:221)
OUT at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85)

有什么想法吗?是我的配置文件等..? 提前致谢 尼克拉斯

1 个答案:

答案 0 :(得分:4)

如果为实体获取的Mongo映射元数据在应用程序启动时不扫描实体,通常会导致这种情况。默认情况下,AbstractMongoConfiguration使用实际配置类的包在启动时查找@Document带注释的类。

异常消息让我假设SpringCloudMongoDBConfiguration不在com.foo.model.project的任何超级包中。有两种解决方案:

  • 坚持将应用程序配置类放入应用程序的根包中的便利。这将导致您的应用程序包被扫描以获取域类,获取的元数据以及按预期进行的新检测工作。
  • 通过覆盖MongoConfiguration.getMappingBasePackage()手动将包含域类的程序包移交给基础结构。

您可能会在本地环境中看到配置的原因是映射元数据可能是通过非持久性持久性操作(例如查询)以及从那里继续执行的所有其他操作获得的。