Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring数据Mongo-继承和可嵌入_Java_Mongodb_Spring Boot_Spring Data_Spring Data Mongodb - Fatal编程技术网

Java Spring数据Mongo-继承和可嵌入

Java Spring数据Mongo-继承和可嵌入,java,mongodb,spring-boot,spring-data,spring-data-mongodb,Java,Mongodb,Spring Boot,Spring Data,Spring Data Mongodb,假设我有一个客户实体,其中包含车辆的列表: @Document public class Customer { private List<Vehicle> vehicles; //... getters, setters } 有没有办法让Spring处理这个用例?i、 e.如果我针对客户保存了汽车和船,那么在查询客户时是否正确保存?目前,我得到了一个java.lang.InstantiationError,因为Spring数据似乎试图创建Vehicle抽象类的实例。设法

假设我有一个
客户
实体,其中包含
车辆的列表

@Document
public class Customer {
  private List<Vehicle> vehicles;

  //... getters, setters
} 

有没有办法让Spring处理这个用例?i、 e.如果我针对客户保存了
汽车
,那么在查询
客户
时是否正确保存?目前,我得到了一个
java.lang.InstantiationError
,因为Spring数据似乎试图创建
Vehicle
抽象类的实例。

设法解决了这个问题

基本上,我需要添加包含
车辆
类的包,以便扫描到我的Mongo配置类,如下所示:

@Primary
@Bean(name = "customerMongoTemplate")
public MongoTemplate customerMongoTemplate() {
  MongoTemplate mongoTemplate = new MongoTemplate(mongoClient(), getDatabaseName());
  MappingMongoConverter converter = (MappingMongoConverter) mongoTemplate.getConverter();
  converter.setCustomConversions(customConversions());
  converter.afterPropertiesSet();
  return mongoTemplate;
}
@Primary
@Bean(name = "customerMongoTemplate")
public MongoTemplate customerMongoTemplate() throws Exception {
  SimpleMongoDbFactory mongoDbFactory = new SimpleMongoDbFactory(mongoClient(), getDatabaseName());

  MongoMappingContext mongoMappingContext = mongoMappingContext();
  mongoMappingContext.setInitialEntitySet(getInitialEntitySet());
  mongoMappingContext.afterPropertiesSet();

  MappingMongoConverter converter = new MappingMongoConverter(new DefaultDbRefResolver(mongoDbFactory), mongoMappingContext);
  converter.setCustomConversions(customConversions());
  converter.afterPropertiesSet();

  return new MongoTemplate(mongoDbFactory, converter);
}
公共类CustomerDbConfig扩展了AbstractMongoConfiguration{
... 
@凌驾
受保护的集合getMappingBasePackages(){
集合mappingBasePackages=new ArrayList();
mappingBasePackages.add(Vehicle.class.getPackageName());
返回mappingBasePackages;
}
}
我认为上述方法在大多数情况下都应该有效。我的理解是,如果配置类与
车辆
类位于同一个包中,则可能不需要上述内容,但是,在我的情况下,它们位于两个不同的包中

此外,在我这方面有点复杂,因为我有多个具有不同配置和不同
MongoTemplate
bean的Mongo数据库

最初,我创建了
MongoTemplate
,如下所示:

@Primary
@Bean(name = "customerMongoTemplate")
public MongoTemplate customerMongoTemplate() {
  MongoTemplate mongoTemplate = new MongoTemplate(mongoClient(), getDatabaseName());
  MappingMongoConverter converter = (MappingMongoConverter) mongoTemplate.getConverter();
  converter.setCustomConversions(customConversions());
  converter.afterPropertiesSet();
  return mongoTemplate;
}
@Primary
@Bean(name = "customerMongoTemplate")
public MongoTemplate customerMongoTemplate() throws Exception {
  SimpleMongoDbFactory mongoDbFactory = new SimpleMongoDbFactory(mongoClient(), getDatabaseName());

  MongoMappingContext mongoMappingContext = mongoMappingContext();
  mongoMappingContext.setInitialEntitySet(getInitialEntitySet());
  mongoMappingContext.afterPropertiesSet();

  MappingMongoConverter converter = new MappingMongoConverter(new DefaultDbRefResolver(mongoDbFactory), mongoMappingContext);
  converter.setCustomConversions(customConversions());
  converter.afterPropertiesSet();

  return new MongoTemplate(mongoDbFactory, converter);
}
但是,通过
MongoTemplate
以这种方式获取
MappingMongoConverter
意味着从未调用
getMappingBasePackages
。我尝试通过执行以下操作获取转换器:

@Primary
@Bean(name = "customerMongoTemplate")
public MongoTemplate customerMongoTemplate() {
  return new MongoTemplate(mongoDbFactory(), mappingMongoConverter());
}
但是它不起作用,因为
mongoDbFactory()
mappingMongoConverter()
正在为不同的MongoDB配置返回bean。。。这对我来说是一个理想的解决方案,但不知道如何让它在多个配置类中可靠地工作

最后,我成功地按如下方式可靠地工作:

@Primary
@Bean(name = "customerMongoTemplate")
public MongoTemplate customerMongoTemplate() {
  MongoTemplate mongoTemplate = new MongoTemplate(mongoClient(), getDatabaseName());
  MappingMongoConverter converter = (MappingMongoConverter) mongoTemplate.getConverter();
  converter.setCustomConversions(customConversions());
  converter.afterPropertiesSet();
  return mongoTemplate;
}
@Primary
@Bean(name = "customerMongoTemplate")
public MongoTemplate customerMongoTemplate() throws Exception {
  SimpleMongoDbFactory mongoDbFactory = new SimpleMongoDbFactory(mongoClient(), getDatabaseName());

  MongoMappingContext mongoMappingContext = mongoMappingContext();
  mongoMappingContext.setInitialEntitySet(getInitialEntitySet());
  mongoMappingContext.afterPropertiesSet();

  MappingMongoConverter converter = new MappingMongoConverter(new DefaultDbRefResolver(mongoDbFactory), mongoMappingContext);
  converter.setCustomConversions(customConversions());
  converter.afterPropertiesSet();

  return new MongoTemplate(mongoDbFactory, converter);
}

我对上述方法并不完全满意,它有点挑剔,可能会导致新版本的Spring出现问题,但是,它确实有效。

设法解决了这个问题

基本上,我需要添加包含
车辆
类的包,以便扫描到我的Mongo配置类,如下所示:

@Primary
@Bean(name = "customerMongoTemplate")
public MongoTemplate customerMongoTemplate() {
  MongoTemplate mongoTemplate = new MongoTemplate(mongoClient(), getDatabaseName());
  MappingMongoConverter converter = (MappingMongoConverter) mongoTemplate.getConverter();
  converter.setCustomConversions(customConversions());
  converter.afterPropertiesSet();
  return mongoTemplate;
}
@Primary
@Bean(name = "customerMongoTemplate")
public MongoTemplate customerMongoTemplate() throws Exception {
  SimpleMongoDbFactory mongoDbFactory = new SimpleMongoDbFactory(mongoClient(), getDatabaseName());

  MongoMappingContext mongoMappingContext = mongoMappingContext();
  mongoMappingContext.setInitialEntitySet(getInitialEntitySet());
  mongoMappingContext.afterPropertiesSet();

  MappingMongoConverter converter = new MappingMongoConverter(new DefaultDbRefResolver(mongoDbFactory), mongoMappingContext);
  converter.setCustomConversions(customConversions());
  converter.afterPropertiesSet();

  return new MongoTemplate(mongoDbFactory, converter);
}
公共类CustomerDbConfig扩展了AbstractMongoConfiguration{
... 
@凌驾
受保护的集合getMappingBasePackages(){
集合mappingBasePackages=new ArrayList();
mappingBasePackages.add(Vehicle.class.getPackageName());
返回mappingBasePackages;
}
}
我认为上述方法在大多数情况下都应该有效。我的理解是,如果配置类与
车辆
类位于同一个包中,则可能不需要上述内容,但是,在我的情况下,它们位于两个不同的包中

此外,在我这方面有点复杂,因为我有多个具有不同配置和不同
MongoTemplate
bean的Mongo数据库

最初,我创建了
MongoTemplate
,如下所示:

@Primary
@Bean(name = "customerMongoTemplate")
public MongoTemplate customerMongoTemplate() {
  MongoTemplate mongoTemplate = new MongoTemplate(mongoClient(), getDatabaseName());
  MappingMongoConverter converter = (MappingMongoConverter) mongoTemplate.getConverter();
  converter.setCustomConversions(customConversions());
  converter.afterPropertiesSet();
  return mongoTemplate;
}
@Primary
@Bean(name = "customerMongoTemplate")
public MongoTemplate customerMongoTemplate() throws Exception {
  SimpleMongoDbFactory mongoDbFactory = new SimpleMongoDbFactory(mongoClient(), getDatabaseName());

  MongoMappingContext mongoMappingContext = mongoMappingContext();
  mongoMappingContext.setInitialEntitySet(getInitialEntitySet());
  mongoMappingContext.afterPropertiesSet();

  MappingMongoConverter converter = new MappingMongoConverter(new DefaultDbRefResolver(mongoDbFactory), mongoMappingContext);
  converter.setCustomConversions(customConversions());
  converter.afterPropertiesSet();

  return new MongoTemplate(mongoDbFactory, converter);
}
但是,通过
MongoTemplate
以这种方式获取
MappingMongoConverter
意味着从未调用
getMappingBasePackages
。我尝试通过执行以下操作获取转换器:

@Primary
@Bean(name = "customerMongoTemplate")
public MongoTemplate customerMongoTemplate() {
  return new MongoTemplate(mongoDbFactory(), mappingMongoConverter());
}
但是它不起作用,因为
mongoDbFactory()
mappingMongoConverter()
正在为不同的MongoDB配置返回bean。。。这对我来说是一个理想的解决方案,但不知道如何让它在多个配置类中可靠地工作

最后,我成功地按如下方式可靠地工作:

@Primary
@Bean(name = "customerMongoTemplate")
public MongoTemplate customerMongoTemplate() {
  MongoTemplate mongoTemplate = new MongoTemplate(mongoClient(), getDatabaseName());
  MappingMongoConverter converter = (MappingMongoConverter) mongoTemplate.getConverter();
  converter.setCustomConversions(customConversions());
  converter.afterPropertiesSet();
  return mongoTemplate;
}
@Primary
@Bean(name = "customerMongoTemplate")
public MongoTemplate customerMongoTemplate() throws Exception {
  SimpleMongoDbFactory mongoDbFactory = new SimpleMongoDbFactory(mongoClient(), getDatabaseName());

  MongoMappingContext mongoMappingContext = mongoMappingContext();
  mongoMappingContext.setInitialEntitySet(getInitialEntitySet());
  mongoMappingContext.afterPropertiesSet();

  MappingMongoConverter converter = new MappingMongoConverter(new DefaultDbRefResolver(mongoDbFactory), mongoMappingContext);
  converter.setCustomConversions(customConversions());
  converter.afterPropertiesSet();

  return new MongoTemplate(mongoDbFactory, converter);
}

我对上述方法并不完全满意,它有点挑剔,可能会导致新版本的Spring出现问题,但是,它确实有效。

如果Spring不管理类,那么很多东西都不起作用。本教程展示了在包级别使用多个Mongo DB实例分离实体的看似干净的方法。看起来更像是spring的方式——我在代码库中做了一些类似于该教程的事情,尽管我的用例有点复杂,因为我需要自定义转换器和类型别名的包扫描。然而,在我的例子中,MongoTemplate正在我的Spring中管理?你认为哪部分会坏掉?如果将
MongoDbFactory
MappingMongoConverter
创建为单独的bean,而不是在创建
MongoTemplate
bean的方法中创建它们,那么这个问题会得到解决吗?如果springs不管理这些类,那么一堆东西就不起作用了。本教程展示了在包级别使用多个Mongo DB实例分离实体的看似干净的方法。看起来更像是spring的方式——我在代码库中做了一些类似于该教程的事情,尽管我的用例有点复杂,因为我需要自定义转换器和类型别名的包扫描。然而,在我的例子中,MongoTemplate正在我的Spring中管理?你认为哪部分会坏掉?通过将
MongoDbFactory
MappingMongoConverter
创建为单独的bean,而不是在创建
MongoTemplate
bean的方法中创建它们,可以解决这个问题吗?