Struts2の自動型変換機能
Struts2では、Actionクラスのフィールドにリクエストパラメータが格納されます。このとき、フィールドの型をString以外にすると、Struts2は自動的にその型へ変換を試みます。
Struts2標準で自動型変換を行える型
以下の型は、特に設定は不要です。
型の分類 | よく使う型 |
---|---|
プリミティブ | int,long |
数値 | Integer,BigDecimal |
配列 | String[] |
コレクション | List,Map |
これらの自動型変換は、Actionクラスのフィールドと、Actionクラスからネストしたフィールドに対しても有効です。
標準以外で型変換を行うには
次の方法があります。
- xwork-conversion.properties に 自動型変換するクラスを宣言する
- Actionクラスごとのpropertiesファイルまたはアノテーションで、フィールド別に型変換クラスを宣言する
前者の方法は Struts2の自動型変換(2014 summer version) にて紹介しています。
今回は後者で、アノーテションを使った記載方法です。
アノテーションで定義する
アノテーションで定義する方法は、Actionクラスに定義するか、またはActionクラスのフィールドからネストしたクラスにて定義します。
例えば、Actionクラスにパラメータを格納するフィールドを用意した場合は、次のようになります。
@Conversion(
conversions = {
@TypeConversion(converter="lumi.converter.BigDecimalConverter" , key="age" )
}
)
@Data
public class SampleVO implements Serializable {
private String username;
private BigDecimal age;
}
@TypeConversionがもつ属性は、次の2つを指定します。
属性名 | 内容 |
---|---|
converter | 型変換の実装クラス名 |
key | フィールド名 |
型変換が失敗した場合
フィールドの型変換が失敗した場合、Struts2は項目エラー(FieldError)として扱います。つまりValidationの1つですので、Validation定義をしておくと型変換に失敗しても、入力値を復元して表示できます。
先ほどの例に、Validationの記述を追加します。
@Conversion(
conversions = {
@TypeConversion(converter="lumi.converter.BigDecimalConverter" , key="age" )
}
)
@Validations(
conversionErrorFields = {
@ConversionErrorFieldValidator(fieldName="age" , key="age.type.mismatch" , repopulateField=true)
}
)
@Data
public class SampleVO implements Serializable {
private String username;
private BigDecimal age;
}
@ConversionErrorFieldValidatorの属性に型変換のパラメータ、メッセージならびに repopulateField=trueを記載することで、元のパラメータを再描画します。