我正在閱讀這本書,Learning Spring Boot 2.0, Second Edition但正在使用,Spring Boot 2.5.6所以我懷疑我的問題可能與我不得不用不同的版本稍微做一些事情有關。
我有這門課:
@Component
public class InitDatabase {
@Bean
CommandLineRunner init(MongoOperations operations) {
return args -> {
operations.dropCollection(Image.class);
operations.insert(new Image("1", "learning-spring-boot-cover.jpg"));
operations.insert(new Image("2", "learning-spring-boot-2nd-edition-cover.jpg"));
operations.insert(new Image("3", "bazinga.png"));
operations.findAll(Image.class).forEach(image -> System.out.println(image.toString()));
};
}
}
當我運行我的應用程式時,我收到此錯誤:
2021-11-25 12:26:42.870 DEBUG 71010 --- [main] osbdLoggingFailureAnalysisReporter:應用程式因例外而無法啟動
org.springframework.beans.factory.NoSuchBeanDefinitionException:沒有可用的“org.springframework.data.mongodb.core.MongoOperations”型別的合格bean:預計至少有1個符合自動裝配候選資格的bean。依賴注釋:{} 在 org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoMatchingBeanFound(DefaultListableBeanFactory.java:1790) ~[spring-beans-5.3.12.jar:5.3.12] 在 org.springframework.beans.factory .support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1346) ~[spring-beans-5.3.12.jar:5.3.12] 在 org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1300) ~[spring-beans-5.3.12.jar:5.3.12] 在 org.springframework.beans.factory.support.ConstructorResolver。
2021-11-25 12:26:42.870 錯誤 71010 --- [主要] osbdLoggingFailureAnalysisReporter:
應用程式無法啟動
描述:
com.paulcarron.learningspringboot.learningspringboot.InitDatabase 中方法 init 的引數 0 需要一個無法找到的“org.springframework.data.mongodb.core.MongoOperations”型別的 bean。
行動:
考慮在您的配置中定義一個型別為 'org.springframework.data.mongodb.core.MongoOperations' 的 bean。
這是我的build.gradle:
plugins {
id 'org.springframework.boot' version '2.5.6'
id 'io.spring.dependency-management' version '1.0.11.RELEASE'
id 'java'
}
group = 'com.paulcarron.learningspringboot'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '11'
configurations {
compileOnly {
extendsFrom annotationProcessor
}
}
repositories {
mavenCentral()
}
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-data-mongodb-reactive'
implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
implementation 'org.springframework.boot:spring-boot-starter-webflux'
implementation 'org.synchronoss.cloud:nio-multipart-parser:1.1.0'
compileOnly 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'
testImplementation 'de.flapdoodle.embed:de.flapdoodle.embed.mongo'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
testImplementation 'io.projectreactor:reactor-test'
implementation 'org.springframework.boot:spring-boot-starter-actuator'
implementation 'javax.persistence:javax.persistence-api:2.2'
}
test {
useJUnitPlatform()
}
我的理解是,@EnableReactiveMongoRepositories如果 Reactive MongoDB 或 Spring DataMongoDB 2.0 在類路徑上,我不需要激活 with因為這是自動完成的。
是否有任何明顯的原因導致這不起作用?
uj5u.com熱心網友回復:
我猜你正試圖在啟動時初始化你的資料庫。
您可以利用 spring 內部事件機制。當您的應用程式準備就緒時,spring 會觸發該事件ApplicationReadyEvent
您可以收聽此事件并初始化您的收藏:
@Component
public class DataInit implements ApplicationListener<ApplicationReadyEvent> {
private final MongoOperations operations;
public DataInit(MongoOperations operations) {
this.operations = operations;
}
@Override
public void onApplicationEvent(ApplicationReadyEvent event) {
// init data
}
}
如果您想了解更多關于春季活動的資訊--> https://www.baeldung.com/spring-events
uj5u.com熱心網友回復:
MongoOperations是以阻塞方式與Mongo互動的介面。ReactiveMongoOperations是以反應方式與 Mongo 互動的介面。
當您使用 WebFlux ( spring-boot-starter-webflux) 時,您似乎想要構建一個回應式應用程式。如果是這樣,你應該更換你的使用MongoOperations有ReactiveMongoOperations。如果你想構建一個阻塞的、基于 Servlet 的 web 應用程式將切換到spring-boot-starter-data-mongodb和spring-boot-starter-web。
uj5u.com熱心網友回復:
我想預加載資料并讀到最好使用阻塞 API 來執行此操作,因為在啟動應用程式時,當 Web 容器和我的加載器都啟動時,存在執行緒鎖定問題的風險。我正在使用的這本書適用于 Spring Boot 和 MongoDB 的舊版本。
這spring-boot-starter-data-mongodb-reactive本書使用的版本似乎包含MongoOperations但后來被拆分了。看到這個。
為了使用它,我添加implementation 'org.springframework.boot:spring-boot-starter-data-mongodb'到我的類路徑中。
如果沒有執行緒鎖的問題,我可以用它ReactiveMongoOperations來代替。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/367650.html
上一篇:使用“$set”時防止貓鼬“Model.updateOne”更新模型的ObjectId(_id)
下一篇:盡管有R值,但看不到散點圖中的點
