首页 > 解决方案 > Mongock 和 @Value 注释似乎不起作用

问题描述

我试图在通过 SpringBootMongockBuilder 创建 SpringBootMongock 对象时使用 @Value 注释来获取 URI 和数据库名称,并且在 mvn install 期间它尝试加载应用程序上下文并失败,因为我的 Spring Contract 测试无法连接到我的应用程序中的数据库。 .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 对象中提取了上述一些值,因为 @Value 对我不起作用.. 无需在此处提供确切的值

例外是

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 注释的记录,一切都按预期工作。

标签: javaspring-bootspring-data

解决方案


该问题与 Mongock 无关,但我很清楚地看到这是由于每当您收到错误时都没有注入 MongoClient。

正如您提到的,当您提供硬编码的 uri 时它可以工作,我很想说 Spring 没有找到spring.data.mongodb.uri,但如果我没有错,它会失败,说找不到属性,而不是你得到的错误,因为您没有提供默认值。

无论如何,由于某种原因,它就在那里,每当您运行它并失败时,MongoClient 都不会出于某种原因添加到上下文中。

希望对你有帮助。


推荐阅读