Home About
Micronaut , mongodb

Micronaut で MongoDB を使う

MicronautMongoDBGORM を使う方法。 ガイドは ここ にある。 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 のバージョンが古いのが原因とか?(未確認)