在通过SpringBootMongockBuilder创建SpringBootMongock对象时,我尝试使用@Value注释来获取URI和数据库名称,并且在mvn安装期间,它试图加载应用程序上下文,但失败了,因为我的Spring tests测试无法连接到我的application.yml文件中的数据库。无论如何,在构建我的应用程序时,我都不想要它。我已经通过在我的方法签名中注入Environment对象解决了这个问题,但是我不明白为什么@Value不起作用。我已经用@Configuration注释了这个类,它工作得很好。
更新:我仍然需要从yaml文件中获取URI,以便使用@Bean注释创建我的MongoClient。
@Configuration
public class MongockConfiguration {
@Value(${spring.data.mongodb.uri})
private String uri;
@Bean
public MongoClient mongoClient(){
return MongoClients.create(uri);
}
@Bean
public SpringBootMongock mongock(Application context, Environment environment) throws Exception {
return new SpringBootMongockBuilder(mongoClient(), dbname, ChangeLogOne.class.getPackage().getName()).setEnabled(migrate).setApplicationContext(applicationContext).build();
}上面的一些值是我从Environment对象中提取的,因为@值对我不起作用。不需要在这里提供确切的值
例外情况是
java.lang.IllegalStateException: Failed to load ApplicationContext
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'mongock' defined in class path resource [blah/dht/mcs/registrationservice/config/MongockConfiguration.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.github.cloudyrock.mongock.SpringBootMongock]: Factory method 'mongock' threw exception; nested exception is com.mongodb.MongoSecurityException: Exception authenticating MongoCredential{mechanism=SCRAM-SHA-1, userName='testUser', source='admin', password=<hidden>, mechanismProperties={}}
Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.github.cloudyrock.mongock.SpringBootMongock]: Factory method 'mongock' threw exception; nested exception is com.mongodb.MongoSecurityException: Exception authenticating MongoCredential{mechanism=SCRAM-SHA-1, userName='testUser', source='admin', password=<hidden>, mechanismProperties={}}
Caused by: com.mongodb.MongoSecurityException: Exception authenticating MongoCredential{mechanism=SCRAM-SHA-1, userName='testUser', source='admin', password=<hidden>, mechanismProperties={}}
Caused by: com.mongodb.MongoCommandException: Command failed with error 18 (AuthenticationFailed): 'Authentication failed.' on server localhost:27017. The full response is { "ok" : 0.0, "errmsg" : "Authentication failed.", "code" : 18, "codeName" : "AuthenticationFailed" }对于使用硬编码的值与使用@Value注释的记录,一切都按预期工作。
发布于 2020-04-09 06:06:10
这个问题与Mongock无关,但我很清楚地看到,这是因为每当你遇到错误时,MongoClient都不会被注入。
正如你提到的,当你提供硬编码的uri时,它是有效的,我很想说Spring找不到spring.data.mongodb.uri,但是如果我没弄错的话,它就不会说属性找不到了,而不是你得到的错误,因为你没有提供默认值。
无论如何,由于某种原因,当你运行它失败的时候,MongoClient不会被添加到上下文中。
我希望你会发现它是有用的。
https://stackoverflow.com/questions/61091513
复制相似问题