host,database,username,password の記載は
uri: mongodb://localhost/spring-mongo
とすることも可能
です。
ここで指定している username,password はどこで設定したかというと、
image: mongo:4.2
の ENTRYPOINT である
、
docker-entrypoint.sh にて実行される .js か .sh ファイル
にて流し込んでいます。
$ ls -1 mongo/init
01_import_init_data.json
01_import_init_data.sh
02_create_user.js
> db.customer.find()
{ "_id" : ObjectId("6024e6a39c82f64f379738ca"), "firstName" : "Mike", "lastName" : "Popcorn", "_class" : "com.kiyotakeshi.spring.mongo.Customer" }
{ "_id" : ObjectId("6024e6a39c82f64f379738cb"), "firstName" : "Sam", "lastName" : "Smith", "_class" : "com.kiyotakeshi.spring.mongo.Customer" }
これらを接続先として、 application.
yaml
で指定していたわけです。
あとは、アプリを起動すると...
./mvnw spring-boot:run
MongoDB につなぎこみ、検索できています。
※このアプリの実装はほぼ
参考
記載の Spring のガイドのままです
------------------------------
Customers found with findAll()
2021-02-14 13:30:26.807 INFO 6466 --- [ main] org.mongodb.driver.connection : Opened connection [connectionId{localValue:3, serverValue:12}] to localhost:27017
Customer{id='6024e6a39c82f64f379738ca', firstName='Mike', lastName='Popcorn'}
Customer{id='6024e6a39c82f64f379738cb', firstName='Sam', lastName='Smith'}
--------------------------------
Customer found with findByFirstName('Alice'):
--------------------------------
Customers found with findByLastName('Smith'):
Customer{id='6024e6a39c82f64f379738cb', firstName='Sam', lastName='Smith'}
2021-02-14 13:30:26.848 INFO 6466 --- [extShutdownHook] org.mongodb.driver.connection : Closed connection [connectionId{localValue:3, serverValue:12}] to localhost:27017 because the pool has been closed.
Process finished with exit code 0
先ほどの設定で、そのままアプリを起動するとコネクション時に認証エラーに。
Caused by: org.springframework.data.mongodb.UncategorizedMongoDbException: Exception authenticating MongoCredential{mechanism=SCRAM-SHA-1, userName='demo', source='spring-mongo', password=<hidden>, mechanismProperties=<hidden>}; nested exception is com.mongodb.MongoSecurityException: Exception authenticating MongoCredential{mechanism=SCRAM-SHA-1, userName='demo', source='spring-mongo', password=<hidden>, mechanismProperties=<hidden>}
Caused by: com.mongodb.MongoSecurityException: Exception authenticating MongoCredential{mechanism=SCRAM-SHA-1, userName='demo', source='spring-mongo', password=<hidden>, mechanismProperties=<hidden>}
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"}
2021-02-14 13:42:18.968 INFO 6735 --- [ main] org.mongodb.driver.connection : Closed connection [connectionId{localValue:4}] to localhost:27017 because there was a socket exception raised by this connection.
以下のように、 application.
yaml
に authentication-database と接続情報を記載する必要があります。
host: localhost
database: spring-mongo
username: root
password: 1qazxsw2
authentication-database: admin
これで無事にコネクションできます。
Spring のガイドの日本語翻訳版
docker-composeでmongoDB環境を構築して使う
【MongoDB】MongoDBのDockerコンテナ起動時に認証用ユーザーを作成する
【備忘録】Spring Boot+MongoDB (Docker) でRESTfulなAPIを作成してCRUDする