Cloud Foundry / mongolab 上 MongoDB 的 @EnableMongoAuditing

@EnableMongoAuditing for MongoDB on Cloud Foundry / mongolab

我的设置在我的本地工作,但当我将它部署到 CloudFoundry/mongolab 时却不行。

配置与 docs 非常相似。

我的本地 spring 配置

@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();
}

}

这是 Cloud Foundry 设置

@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)

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

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

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

  • 坚持将应用程序配置 classes 放入应用程序的根包中的便利性。这将导致扫描您的应用程序包以查找域 classes、获取的元数据以及 is-new-detection 按预期工作。
  • 通过覆盖 MongoConfiguration.getMappingBasePackage().
  • 手动将包含域 classes 的包交给基础设施

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