Micronaut で MongoDB と GORM を使う方法。 ガイドは ここ にある。 Micronaut の version 2.5.7 では、問題なく作動したが、 version 3.3.0 では version 2.5.7 と同じようにアプリケーションを作成しても No GORM implementations configured などのエラーが出てうまく作動しなかった。
Micronaut の version を確認:
$ mn --version
Micronaut Version: 2.5.7
MongoDB をインストール:
$ sudo apt install mongodb-server mongodb-clients
いつもどおり、アプリケーションとアイテムコントローラーを作成:
$ mn create-app my-db --features mongo-gorm
$ cd my-db
$ mn create-controller item
mongo-gorm を使うと、言語は groovy になる。
GORM を使うには application.yml にデータベースを設定する必要がある。 grails.mongodb.databaseName: mydb を追加するだけ。
src/main/resources/application.yml
micronaut:
application:
name: myDb
grails.mongodb.databaseName: mydb
mongodb.uri: mongodb://${MONGO_HOST:localhost}:${MONGO_PORT:27017}
保存用の Item クラスを作成:
src/main/groovy/my/db/Item.groovy
package my.db
import grails.gorm.annotation.Entity
@Entity
class Item {
String name
}
Entity アノテーションを付けなければならない。
mn create-controller item でひな形を生成済みの src/main/groovy/my/db/ItemController.groovy を修正する:
package my.db
import io.micronaut.http.annotation.Controller
import io.micronaut.http.annotation.Get
import grails.gorm.transactions.Transactional
import io.micronaut.scheduling.TaskExecutors
import io.micronaut.scheduling.annotation.ExecuteOn
@Controller("/item")
class ItemController {
@Get(uri="/", produces="text/plain")
@ExecuteOn(TaskExecutors.IO)
@Transactional
String index() {
def itemCount = Item.list().size()
new Item(name: "item ${(itemCount+1)}").save(flush:true)
return Item.list().toString()
}
}
それでは実行する:
$ ./gradlew run
サーバが起動したら、 http://localhost:8080/item/ にブラウザでアクセスする:
[my.db.Item : 1]
データが MongoDB 上に作成されたのか確認:
$ mongo
> show dbs
mydb 0.000GB
> use mydb
switched to db mydb
> show collections
item
item.next_id
> db.item.find()
{ "_id" : NumberLong(1), "name" : "item 1", "version" : NumberLong(0) }
できている。
ここまで、簡単にできる。
ただ、冒頭に書いたように、Micronaut version 3.3.0 で同じようにアプリケーションをつくっても、エラーになってしまう。 GORM のエラーのようなので、GORM 自体に詳しければ難なく解消できる問題なのかもしれない。 もしかすると 使用している MongoDB のバージョンが古いのが原因とか?(未確認)