avans 0.39.0 における @QueryParam と @BodyParam の廃止について
Avans に非互換の変更を入れます。
移行処置として、次のバージョンでは @Deprecated をつけた状態で一旦リリースします。その次のバージョンで削除します。
なにが問題か
Servlet Filter で HttpServletRequest#getParameter()
を呼んでしまうと、POST で application/x-www-urlencoded または multipart/form-data の場合に content-body が読めない。
なぜ起きるか
現行の実装では HttpServletRequest#getInputStream()
から POST body を自前でパースしている。Servlet Filter が getParameter() を呼んでしまうと input stream が消費され、POST body を処理できなくなる。
互換性を維持したままの解決策はないか
HttpServletRequest#getInputStream()
の結果から Query parameter の値を引いたものを body parameter とするように変更することにより互換性を維持することは可能である。
互換性を維持する必要はあるか?
できれば維持したいが、そもそも query parameter と body parameter をわけて処理することに実用上の意味はないので、そこを頑張って実装してもしょうがない。
もともと分けたのは JAX-RS を意識しすぎた結果なので。。。
ついでに、、
commons-fileupload への依存を取り除き、Servlet 3.0 の upload API を利用するようにする。
移行プランについて
- webscrew 0.9.0 で WebRequest, WebRequestUpload 等を @Deprecated とする
- avans 0.39.0 で @QueryParam と @BodyParam を @Deprecated とし、@Param を追加する
- @QueryParam と @BodyParam は @Param のエイリアスとなる(非互換)
- javax.servlet.http.Part のサポートを追加する
- WebRequest を直接とれる getRequest() が廃止され getServletRequest() が新設
- webscrew 0.10.0 で前バージョンで Deprecated にしたものを削除する。リリース時期は一週間後を予定。
- avans 0.40.0 で前バージョンで Deprecated にしたものを削除する。リリース時期は一週間後を予定。
移行方法
perl -pe 's/\@(Query|Body)Param/\@Param/g' src/**/*.java
とする- WebRequestUpload を使っている部分を javax.servlet.http.Part に変更する
Controller#getRequest()
を叩いているところをController#getServletRequest()
使うように変更Controller#getParameters()
を利用しているところをController#getParams()
使うように変更
移行時に留意するべき点について
File upload まわりについてはサーブレットコンテナの設定が必要な場合があるので注意。 Embedded jetty の場合には以下のように設定する。
servletHolder.getRegistration().setMultipartConfig( new MultipartConfigElement(tmpDirName));
Published: 2014-12-25(Thu) 08:51