Help us understand the problem. What is going on with this article?

Spark FrameworkをGroovyで動かす

More than 5 years have passed since last update.

Spark」はJavaで書かれたSinatraライクなWebフレームワーク。
Java8で導入されたラムダ式を取り入れてシンプルな記述でサービスが作成できる。

Groovyのクロージャを、ラムダ式が期待される部分に当て嵌めたところ、期待通りに動いたのでここに記録する。

  • Gradle 2.3
  • Java 1.8.0_11
  • Groovy 2.4.1
初期設定
$ mkdir SparkGroovyExample
$ cd SparkGroovyExample
$ gradle init --type groovy-library

build.gradleを編集。
dependenciesにsparkを追加。
"gradlew run"が使いたかったので、applicationプラグインを追加し、mainClassNameを指定している。

build.gradle
apply plugin: 'groovy'
apply plugin: 'application'

mainClassName = 'ExampleService' // パッケージ名も必要に応じて指定 foo.bar.ExampleService等

repositories {
    jcenter()
}

dependencies {
    compile 'org.codehaus.groovy:groovy-all:2.4.0'

    testCompile 'org.spockframework:spock-core:0.7-groovy-2.0'
    testCompile 'junit:junit:4.12'

    compile 'com.sparkjava:spark-core:2.1'
}

build.gradleの、mainClassNameで指定したクラスにmainメソッドを記述する。

ExampleService.groovy
import static spark.Spark.*
import groovy.json.JsonBuilder

class ExampleService {
    public static void main(String[] args) {

        Object.metaClass.asJson = {
            def builder = new JsonBuilder(delegate);
            builder.toString()
        }

        def obj = new A();

        def map = [:]
        map['foo'] = 'Hello!!!'
        map['bar'] = [1, 2, 3]
        map['boo'] = ['hoge' : 'aaa', 'fuga' : [1, 2, ['obj':obj]]]

        get('/obj', { req, res -> obj.asJson() })
        get('/map', { req, res -> map.asJson() })

    }
}

MapとObjectでJSONシリアライズの様子を確認するために適当なクラスを定義。

A.groovy
class A {
    def x = 1
    def y = 'qwerty'
    def z = ['a':1, 'b': [111, 222, 333]]
}

実行。

実行
$ ./gradlew run

:compileJava UP-TO-DATE
:compileGroovy UP-TO-DATE
:processResources UP-TO-DATE
:classes UP-TO-DATE
:run
[Thread-1] INFO spark.webserver.SparkServer - == Spark has ignited ...
[Thread-1] INFO spark.webserver.SparkServer - >> Listening on 0.0.0.0:4567
[Thread-1] INFO org.eclipse.jetty.server.Server - jetty-9.0.2.v20130417
[Thread-1] INFO org.eclipse.jetty.server.ServerConnector - Started ServerConnector@4a92881d{HTTP/1.1}{0.0.0.0:4567}
> Building 80% > :run

Webブラウザなどから、http://localhost:4567/objhttp://localhost:4567/map にリクエスト。

レスポンス1
http://localhost:4567/obj

{"z":{"a":1,"b":[111,222,333]},"y":"qwerty","x":1}
レスポンス2
http://localhost:4567/map

{"foo":"Hello!!!","bar":[1,2,3],"boo":{"hoge":"aaa","fuga":[1,2,{"obj":{"z":{"a":1,"b":[111,222,333]},"y":"qwerty","x":1}}]}}

クロージャの振る舞い、JSONの返り値は期待通り。
ゴテゴテした記述がなく、サックリ動いたのは好印象。

kaminami
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away