Exception authenticating MongoDB при подключении с Java к Docker, проблема с MongoCredential, но из CLI все работает
У меня есть приложение, в котором я использую докер для поднятия базы данных Mongo. В Java я реализовываю это с помощью org.testcontainers. С другой стороны, я использую MongoClient, где я передаю MongoCredentials, для подключения к этой базе данных в докере. Я использую абсолютно одинаковые конфигурационные данные для настройки конфигурации докера и MongoCredential, но когда я пытаюсь использовать MongoClient каким-либо образом, я получаю что-то вроде
Exception authenticating MongoCredential{mechanism=SCRAM-SHA-1, userName='username', source='database', password=<hidden>, mechanismProperties=<hidden>}
В то же время я пытаюсь взаимодействовать с MongoDB через командную строку, и с этим нет никаких проблем (естественно только в том случае, если я передаю правильные конфигурационные данные, что означает что сам докер сконфигурирован верно). Таким образом я настраиваю свой контейнер:
private static final String MONGO_ENV_USERNAME = "MONGO_INITDB_ROOT_USERNAME";
private static final String MONGO_ENV_PASSWORD = "MONGO_INITDB_ROOT_PASSWORD";
private static final String MONGO_ENV_DATABASE = "MONGO_INITDB_DATABASE";
private static final int MONGO_PORT = 27017;
private static final String PATH_MONGO_PORT = "mongodb.port";
private static final String CONTAINER_NAME = "mongo:latest";
private GenericContainer<?> getMongoDbContainer(final GlobalConfiguration.Mongodb mongodb) {
return new GenericContainer<>(DockerImageName.parse(CONTAINER_NAME))
.withExposedPorts(MONGO_PORT)
.withEnv(MONGO_ENV_USERNAME, mongodb.username())
.withEnv(MONGO_ENV_PASSWORD, mongodb.password())
.withEnv(MONGO_ENV_DATABASE, mongodb.database());
}
И это конфигурация моего MongoClient:
@Configuration
public class MongoDBConfiguration {
@Bean
public MongoClient mongoClient(final GlobalConfiguration globalConfiguration,
final MongoCredential mongoCredential) {
GlobalConfiguration.Mongodb mongodb = globalConfiguration.mongodb();
ServerAddress mongoAddress = new ServerAddress(mongodb.host(), mongodb.port());
MongoClientOptions mongoClientOptions = MongoClientOptions.builder().build();
return new MongoClient(mongoAddress, mongoCredential, mongoClientOptions);
}
@Bean
public MongoCredential mongoCredential(final GlobalConfiguration globalConfiguration) {
GlobalConfiguration.Mongodb mongodb = globalConfiguration.mongodb();
return MongoCredential.createCredential(mongodb.username(),
mongodb.database(),
mongodb.password().toCharArray());
}
}
То есть, по сути, я поднимаю докеровский контейнер указывая определенные проперти для аунтефикации и создаю клиент, который должен уметь конектится к базе в контейнере, используя те же проперти. Поставив брекпоинт в IDЕ перед каким-либо применение клиента я захожу в командную строку, передаю все те же проперти спокойненько работаю с базой, но клиент почему-то имея все те же проперти получает статус "Authentication failed". Что я делаю не так?