「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/obj 、http://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の返り値は期待通り。
ゴテゴテした記述がなく、サックリ動いたのは好印象。