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的方法中创建它们,可以解决这个问题吗?