09.リクエストパラメタの型変換(conversion)

概要

ここでは、リクエストパラメタを型変換する機能を見ていきます。

型変換とは、例えばリクエストパラメタで"12"が渡ってきたときに、intのプロパティに設定するなどすることです。

リクエストパラメタは当然すべて文字列なので、通常ではintにそのまま値は設定できません。

このように文字列⇒intや、文字列⇒Dateなどの変換を見ていきます。

型変換の基本

型変換は、既に用意されているものをそのまま使用する場合と、自作する場合とがあります。

既に用意されているものを使用する場合は、特に設定が不要です。

ですので、自作する場合を見ていこうと思います。

【補足】

既に用意されているものには、int, long, boolean, Integerなどがあります。

用意されていないものには、BigDecimal、BigIntegerなどがあります。

またDate型は用意されているようですが、日本の日付書式には合っていないので自作した方がよいかもしれません。

この記事では、BigDecimalの型変換を作ってみることにします。

自作の型変換のサンプル

<型変換(Converter)クラス: com.converter.MyBigDecimalTypeConverter>

import java.math.BigDecimal;

import java.util.Map;

import org.apache.struts2.util.StrutsTypeConverter;

import com.opensymphony.xwork2.conversion.TypeConversionException;

public class MyBigDecimalTypeConverter extends StrutsTypeConverter {

/**

* context ...ActionContext

* values ...HTMLから渡ってきた値。同じパラメタ名が複数あれば複数設定される。

* type ...変換先のクラス型

*/

@Override

public Object convertFromString(Map context, String[] values, Class type) {

if(values == null || values.length == 0 || values[0].trim().length() == 0) {

return null;

}

Object dec = null;

try{

dec = new BigDecimal(values[0]);

}catch(Exception e){

throw new TypeConversionException("BigDecimal型への変換に失敗しました。", e);

}

return dec;

}

/**

* このメソッドは、JSP中のognl式で文字列にするときに使用されたりする。

* @param context -[in]action context

* @param obj -[in]値

*/

@Override

public String convertToString(Map context, Object obj) {

if(obj == null) return "";

return obj.toString();

}

}

型変換クラスはStrutsTypeConverterをimplementsして作成します。

このインターフェースは、Struts2専用のものですので、Struts2以外の型変換には使用しないように注意してください。

注目すべきは、convertFromStringメソッドです。

このメソッドが文字列から目的の型へ変換するものです。

【型変換に失敗したとき】

型変換に失敗したときは、TypeConversionExceptionをthrowすれば良いでしょう。

基本的にはこれだけで完了です。

あとはこのクラスを設定するだけです。

<Converterを設定するファイル: src/xwork-conversion.properties>

# syntax: <type> = <converterClassName>

java.math.BigDecimal=com.converter.MyBigDecimalTypeConverter

上記のファイルをクラスパスに置くだけでBigDecimalに変換するときは、いつでも自作クラスが使用されます。

もし、型変換エラーを妥当性チェックとして扱いたい場合は、conversionErrorインターセプターを使用するか、

妥当性チェックのconversionを使用するかすればよいでしょう。

割と簡単に型変換を実現できることが分かります。

Created Date: 2012/03/08