Scalatra のアクションで Int が返らなくてはまった

表題の通りです。ScalatraSlick を使っててはまりました。

はまりポイント

get("/") {
  db withSession {
    Pokemons.insert(303, "Mawile")
  }
}

^ みたいな、Slick を使って insert するだけの簡単なお仕事をするアクションをブラウザから叩くと、データは挿入されるのにページのロードが全然終わらない。。公式 にサンプルとして載ってるレベルなのに。。つらい。

insert の返り値ってなんなの??

当然ここを疑います。
こちらの記事 を参考にして xerial-lens で返り値の型を出力してみると、Int の 1 でした。

どういうこと??

公式の Actions の Default behavior によると、IntAny に該当するはずで、その Any はどうなるかというと、、

For any other value, if the content type is not set, it is set to text/plain. The value is converted to a string and written to the response’s writer.

とあります。なので、String に変換されると思っていたのですが、それが間違いでした。

Scalatra の ソースコード をたどってみると、現時点(2.3 系)の scalatra/core/src/main/scala/org/scalatra/ScalatraBase.scalarenderPipeline に以下のようなコードが。。

case status: Int => response.status = ResponseStatus(status)

HTTP のレスポンスコードに変換されてるや〜ん。すっきり〜。
でも仕様としてどうなんでしょこれ??

comments powered by Disqus