pra*_*ril 5 spring-data-mongodb spring-boot
当我与MongoRepository一起使用功能时,出现“ 找不到类型类的PersistentEntity ”错误@EnableMongoAuditing。当数据库中不存在集合时我保存文档时会发生这种情况。
我尝试了以下内容:
但没有任何效果。
提到的是:
通过AbstractMongoConfiguration扩展MongoConfig并覆盖所有方法。
这是我的代码,它重现了相同的错误:
MongoConfig类
@Configuration
public class MongoConfig extends AbstractMongoConfiguration {
@Value("${spring.data.mongodb.host}")
private String mongoHost;
@Value("${spring.data.mongodb.port}")
private String mongoPort;
@Value("${spring.data.mongodb.database}")
private String mongoDB;
@Override
public MongoDbFactory mongoDbFactory() {
return new SimpleMongoDbFactory(new MongoClient(mongoHost + ":" + mongoPort), mongoDB);
}
@Override
public MongoClient mongoClient() {
return new MongoClient(mongoHost, Integer.parseInt(mongoPort));
}
@Override
public MongoTemplate mongoTemplate() {
return new MongoTemplate(mongoDbFactory());
}
@Override
public MappingMongoConverter mappingMongoConverter() {
return new MappingMongoConverter(new DefaultDbRefResolver(mongoDbFactory()), new MongoMappingContext());
}
@Override
protected String getDatabaseName() {
return mongoDB;
}
}
Run Code Online (Sandbox Code Playgroud)
人员集合类
@Document
public class Person {
@Id
private String id;
private String name;
@CreatedDate
private LocalDateTime createdAt;
@LastModifiedDate
private LocalDateTime lastModified;
// Getter Setters Constructors omitted for brevity
}
Run Code Online (Sandbox Code Playgroud)
主要应用类别
@EnableMongoAuditing
@EnableMongoRepositories ({"com.example.*", "org.apache.*"})
@SpringBootApplication
@ComponentScan({"com.example.*", "org.apache.*"})
public class DemoApplication implements CommandLineRunner {
@Autowired
PersonRepository personRepository;
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
@Override
public void run(String... args) throws Exception {
Person p1 = new Person("1", "prakhar");
personRepository.save(p1);
}
}
Run Code Online (Sandbox Code Playgroud)
预期结果是Person实体应保存在数据库中。实际结果是“ 找不到类型类Person的PersistentEntity ”错误
看起来你遇到了https://github.com/spring-projects/spring-boot/issues/12023
扩展 AbstractMongoConfiguration 将关闭 Spring Boot 对各种 Mongo 组件的自动配置,并自定义用于扫描映射的基础包。我建议你不要在 Spring Boot 中使用它。
更新
我设法让示例运行,配置很简单
@Configuration
public class MongoConfig {
@Value("${spring.data.mongodb.host}")
private String mongoHost;
@Value("${spring.data.mongodb.port}")
private String mongoPort;
@Value("${spring.data.mongodb.database}")
private String mongoDB;
@Bean
public MongoDbFactory mongoDbFactory() {
return new SimpleMongoDbFactory(new MongoClient(mongoHost + ":" + mongoPort), mongoDB);
}
@Bean
public MongoClient mongoClient() {
return new MongoClient(mongoHost, Integer.parseInt(mongoPort));
}
}
Run Code Online (Sandbox Code Playgroud)
和应用程序类
@EnableMongoAuditing
@SpringBootApplication
public class DemoApplication implements CommandLineRunner {
@Autowired
PersonRepository personRepository;
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
@Override
public void run(String... args) throws Exception {
Thread.sleep(2000);
Person p1 = new Person("1", "prakhar");
personRepository.save(p1);
}
}
Run Code Online (Sandbox Code Playgroud)
请注意,我遵循了自己的建议,并没有继承自AbstractMongoConfiguration
解释
问题出在初始化
@Bean
public MappingMongoConverter mappingMongoConverter() {
return new MappingMongoConverter(new DefaultDbRefResolver(mongoDbFactory()), new MongoMappingContext());
}
Run Code Online (Sandbox Code Playgroud)
您只需调用MongoMappingContext构造函数,而不调用setInitialEntitySet. 将其与MongoDataConfiguration自动配置类进行比较。
@Bean
@ConditionalOnMissingBean
public MongoMappingContext mongoMappingContext(MongoCustomConversions conversions)
throws ClassNotFoundException {
MongoMappingContext context = new MongoMappingContext();
context.setInitialEntitySet(new EntityScanner(this.applicationContext)
.scan(Document.class, Persistent.class));
Class<?> strategyClass = this.properties.getFieldNamingStrategy();
if (strategyClass != null) {
context.setFieldNamingStrategy(
(FieldNamingStrategy) BeanUtils.instantiateClass(strategyClass));
}
context.setSimpleTypeHolder(conversions.getSimpleTypeHolder());
return context;
}
Run Code Online (Sandbox Code Playgroud)
更糟糕的是,您没有注册MongoMappingContext为托管 bean。因此,仍然会创建自动配置类。AbstractMappingContext.addPersistentEntity这导致了竞争条件,我尝试运行原始代码并且可以轻松地重现错误,但测试中的断点总是通过。
| 归档时间: |
|
| 查看次数: |
849 次 |
| 最近记录: |