1.0.x から 1.1.x への移行

バージョン 1.0.x から 1.1.x へ移行する際に注意すべき点を解説します。

互換性のない変更点

リクエストパラメータをバインドするプロパティ

1.0.x ではリクエストパラメータはその名前と同名のプロパティにバインドされます。
これだと、想定外のパラメータが入力された場合には(インジェクションされることを想定したプロパティなど) 想定外のプロパティにバインドされてしまうことがあります。

たとえば、以下のソースではリクエストに "fooService" というパラメータがあった場合に fooService に String 型のオブジェクトをバインドしようとして例外が発生してしまいます。

public class FooAction extends Action {
        public String name;
        public FooService fooService;
}

これは問題があるので、1.1.x 以降ではバインドされるプロパティとバインドされないプロパティを明確に分類できるようになっています。

アクション自身にリクエストパラメータをバインドしていた場合は、リクエストパラメータをバインドしたいプロパティを @RequestParameter で修飾してください。

public class FooAction extends Action {
        public @RequestParameter String name;
        public FooService fooService;
}

また、1.0.x と同様にすべてのプロパティをバインド対象とすることもできます。
詳細はリクエストパラメータのバインドを参照してください。

リクエストパラメータをバインディングする際の型変換

1.0.x ではリクエストパラメータをバインディングする際の型変換に S2Dxo の機能、コンバータを使用していましたが、 1.1.x では型変換を内包しています。

org.seasar.extension.dxo.converter.Converter を実装した独自のコンバータクラスをコンテナに登録しておくことで型変換に使用することができましたが、 そのような独自コンバータを使っていた場合は org.seasar.cubby.converter.Converter を実装したクラスに置き換えてください。

@DxoConverter でプロパティごとに独自のコンバータを指定することができましたが、これは機能しません。

マルチバイト文字を含む URL の文字化け

1.0.x では HttpServletRequest#getRequestURI() からパスを取得していましたが、 1.1.x では HttpServletRequest#getServletPath() からパスを取得するようになりました。 これは、Jetty など getRequestURI() の結果に URL 埋め込みセッション情報まで含むコンテナがあるためです。

しかし、副作用として Tomcat などのデフォルト状態では URL にマルチバイト文字が含まれる場合に文字化けしてしまいます。 回避するためには conf/server.xml の Connector ディレクティブに URIEncoding でエンコードを指定してください。

<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" URIEncoding="UTF-8" />

この設定はサーブレットコンテナに配備されたアプリケーション全体に影響します。 バージョン 1.1.1 以降ならば特定のアプリケーションだけにエンコードを指定したい場合はサーブレットフィルタ org.seasar.cubby.filter.EncodingFilter の初期化パラメータで URI のエンコードを指定することができます。

推奨されない API

@Form#binding

@Form#binding は推奨されない API となりました。
リクエストパラメータをオブジェクトにバインドしない場合は @Form#bindingTypeNONE) を指定してください。