JSONICの次バージョンからwinstone対応やめます

Seasar2でFORM RESTモードが動かないという報告があった。その件は重々承知していたので週末使って対応した。jsonic-1.2という形で来週あたりリリースする予定。

Seasar2でFORM RESTが動かないのは、JSONICの1.1系ではapplication/x-www-form-urlencodedで送られてきた内容を自力で解析しているため、JSONICに届く前にgetParameterを呼ばれると送信データが消費されてしまうからだ(次バージョンで修正されるらしいけれど、現バージョンのSeasar2ではS2ContainerFilterでgetParemeterMapが呼ばれる)。

元々、こんな変な仕様になっているのは、POSTで送られたFORMデータをQueryStringをいじられて修正できるのは如何なものかと思いQueryStringよりもPOSTで送られた内容を優先したかったからだ。しかしながら、Java Servletでは得られたパラメータがQueryStringのものなのか、POSTで送られてきた内容なのか判別できない。

ただ、理由はそれだけではない。JSONICJUnitテストで使っているwinstoneに不具合があって、request.getContentType()やrequest.getParemeter()を呼び出した後にrequest.getInputStream()を呼び出すとエラーになってしまう。winstoneを使ったテストは非常に効率がよく手放せなくなっていたので、何とか上記問題を回避すべく現在の仕様にしたのだが、winstoneもリリース頻度が下がっており当面対応されそうにない。

次バージョンでは非互換が発生してしまうが次のようにする。

  • QueryStringよりPOSTが優先される仕様は維持(getParameterからQueryStringを処理した結果重なる部分を差し引く)
  • Content-Typeがappliation/json時のみJSONとしてパースする(現在は、application/x-www-form-urlencodedでなければすべてJSON扱い)

JUnitテストもwinstoneを止め、最近人気のJettyに鞍替えすることにした。必要なjarが多かったり必要な記述量が多くなったりClassLoadingの仕様に難があるけれど致し方あるまい。速度的な面での不満はないので、これで良しとしよう。