Class BeanParamMapper
パラメータをBean、Entityにセットするためのユーティリティです。
Commandのインスタンスとして当BeanParamMapperのインスタンスを保持し、
Command.execute(RequestContext)
にて、
invalid reference
#populate(Object, Map)
パラメータ名(formのinputタグのnameなど)にて、beanのどのプロパティに値をセットするかを指定します。デフォルトの設定では、以下のような命名規則が適用されます。
- パラメータ名と名前が一致するプロパティに値をセットします
- "."により、ネストされたプロパティを表現します。
- "[x]"(xは数値)により、List/配列のインデックス指定可能です。
- "['key']"(keyは任意の文字列)により、Mapのキー指定可能です。
- Mapのキー表現"propA['key']"は、propA.keyと表現も可能です。
以下に、HTML上のFormのname定義と、その際呼び出されるメソッドのイメージの例を示します。
HTML上のFormでの定義 | 呼び出されるメソッドのイメージ |
---|---|
<input type="text" name="age" value="25"> | formBean.setAge(25) |
<input type="text" name="accout.mail" value="test@test.isid.co.jp"> | formBean.getAccount().setMail("test@test.isid.co.jp") |
<input type="text" name="details[0].id" value="123"> | formBean.getDetails()[0].setId("123") |
<input type="text" name="map['key1'].id" value="123"> | formBean.getMap().get('key1').setId("123") |
<input type="text" name="map.key1.id" value="123"> | formBean.getMap().get('key1').setId("123") |
また、name表現時のデリミタをdelimiters(char, char, char)
にて設定することが可能です。それぞれのデリミタ文字はそれぞれ異なる必要があります。
ある特定のパラメータのみ自動マッピングしたい場合は、paramPrefixを指定可能です。指定した場合、paramPrefixに前方一致するパラメータのみマッピングされます。
whitelistPropertyNameRegexを指定することにより、明示的にセット可能なプロパティを正規表現にて制限することが可能です。
注意
当ユーティリティクラスを利用しパラメータを自動的にBeanに格納する際、パラメータ名、値は改竄の恐れがあることを十分注意してください。 入力値のチェックはもちろんのこと、特にパラメータ名も改竄されうることを認識し、その対策を行ってください。 各Formに対して、それぞれ個別のFormBeanを作成しない場合(Entityなどにダイレクトにマッピングする場合、複数のFormで共通のBeanを利用する場合など)は、 対策としてwhitelistPropertyNameRegexを指定し、設定可能なプロパティの範囲を制限してください。
autoGrowをtrueに設定した場合、ネストされたBeanがnullの場合、配列、List、Mapのサイズが足りない、またインスタンスがnullの場合、自動的に拡張させることが可能です。 インスタンスはプロパティとして定義される型のインスタンスが生成されます。List、Mapの場合はparameterized typeのインスタンスが生成されます。 配列、List、Mapのサイズの最大サイズは、indexedPropertySizeLimitで定義されます。この値以上のindex値を指定されたとしても自動拡張は行われません。 デフォルト値は128です。
また、withValidationをtrueに設定すると、マッピング処理の際にBeanValidtionに基づくバリデーションを実施することが可能です。 バリデーションにてエラーがある場合、最終的にMappingExceptionがスローされます。MappingExceptionには、バリデーションエラーとなったプロパティと値、エラーメッセージが保持されます。
以下にCommandでの利用例を示します。
public class SampleCommand implements Command { //BeanParamMapperのインスタンスをコンストラクト時に初期化 private BeanParamMapper mapper = new BeanParamMapper().paramPrefix("_").whitelistPropertyNameRegex("^(age|name|details\..*)\\$"); @Override public String execute(RequestContext request) { FormBean bean = new FormBean(); //beanに値を格納。_age, _name, _details.id などparamPrefix、whitelistPropertyNameRegexにマッチするパラメータがプロパティにセットされる。 mapper.populate(bean, request.getParamMap()); //業務ロジックなど : : return "OK"; } }
populate(Object, Map, Class...)
メソッドはスレッドセーフですが、それ以外の delimiters(char, char, char)
等の設定用メソッドがスレッドセーフではありません。
BeanParamMapperの初期化はCommandのコンストラクタ内で行い、executeメソッド内では設定変更は行わないでください。
-
Field Summary
Modifier and TypeFieldDescriptionstatic final char
デフォルトのindexPostfixです。static final char
デフォルトのindexPrefixです。static final int
デフォルトのindexedPropertySizeLimitです。static final char
デフォルトのpropertyDelimiterです。 -
Constructor Summary
-
Method Summary
Modifier and TypeMethodDescriptiondelimiters
(char propertyDelimiter, char indexPrefix, char indexPostfix) パラメータ名のデリミタ表現を設定します。 各デリミタに指定する文字はそれぞれ異なる必要があります。ネストされたBean、List, 配列、Mapにおいて、パラメータ名で指定されるパスに値が存在しない場合、 自動的に拡張するように設定します。パラメータの値が空文字の場合、nullに変換するように設定します。パラメータの値がStringの場合、trimを行うように設定します。int
char
char
char
boolean
indexedPropertySizeLimit
(int indexedPropertySizeLimit) autoGrowが有効化されている場合、List、配列、Mapにおいて自動拡張する最大サイズを設定します。boolean
boolean
boolean
isTrim()
paramPrefix
(String paramPrefix) BeanMapperでbeanにマップするパラメータを限定するためのPrefixを設定します。 当該のparamPrefixと前方一致するパラメータのみbeanにマップされます。void
指定のbeanに、paramsで指定されるパラメータをセットします。void
setAutoGrow
(boolean autoGrow) void
setEmptyToNull
(boolean emptyToNull) void
setIndexedPropertySizeLimit
(int indexedPropertySizeLimit) void
setIndexPostfix
(char indexPostfix) void
setIndexPrefix
(char indexPrefix) void
setParamPrefix
(String paramPrefix) void
setPropertyDelimiter
(char propertyDelimiter) void
setTrim
(boolean trim) void
setTypeConversionErrorHandler
(Consumer<MappingError> typeConversionErrorHandler) void
setWhitelistPropertyNameRegex
(String whitelistPropertyNameRegex) void
setWithValidation
(boolean withValidation) typeConversionError
(Consumer<MappingError> typeConversionErrorHandler) 型変換に失敗した場合のエラーメッセージをカスタマイズするなどの処理を行う場合、セットします。 例)void
明示的に指定のbeanに対してValidationを実行します。whitelistPropertyNameRegex
(String whitelistPropertyNameRegex) 設定可能なプロパティ名表現の正規表現を設定します。 正規表現によるチェックは、paramPrefixを取り除いた後に実施されるため、 正規表現には、paramPrefixは省いた形で指定します。パラメータをBeanにセットする際に、BeanValidationによるバリデーションを行うように設定します。
-
Field Details
-
DEFAULT_PROPERTY_DELIMITER
public static final char DEFAULT_PROPERTY_DELIMITERデフォルトのpropertyDelimiterです。- See Also:
-
DEFAULT_INDEX_PREFIX
public static final char DEFAULT_INDEX_PREFIXデフォルトのindexPrefixです。- See Also:
-
DEFAULT_INDEX_POSTFIX
public static final char DEFAULT_INDEX_POSTFIXデフォルトのindexPostfixです。- See Also:
-
DEFAULT_INDEXED_PROPERTY_SIZE_LIMIT
public static final int DEFAULT_INDEXED_PROPERTY_SIZE_LIMITデフォルトのindexedPropertySizeLimitです。- See Also:
-
-
Constructor Details
-
BeanParamMapper
public BeanParamMapper()
-
-
Method Details
-
withValidation
パラメータをBeanにセットする際に、BeanValidationによるバリデーションを行うように設定します。- Returns:
- BeanParamMapper自身のインスタンス
-
enableAutoGrow
ネストされたBean、List, 配列、Mapにおいて、パラメータ名で指定されるパスに値が存在しない場合、 自動的に拡張するように設定します。- Returns:
- BeanParamMapper自身のインスタンス
-
enableTrim
パラメータの値がStringの場合、trimを行うように設定します。- Returns:
- BeanParamMapper自身のインスタンス
-
enableEmptyToNull
パラメータの値が空文字の場合、nullに変換するように設定します。- Returns:
- BeanParamMapper自身のインスタンス
-
delimiters
パラメータ名のデリミタ表現を設定します。 各デリミタに指定する文字はそれぞれ異なる必要があります。- Parameters:
propertyDelimiter
- ネストされたプロパティを指定する際の文字indexPrefix
- インデックス値を囲む先頭文字indexPostfix
- インデックス値を囲む接尾文字- Returns:
- BeanParamMapper自身のインスタンス
-
paramPrefix
BeanMapperでbeanにマップするパラメータを限定するためのPrefixを設定します。 当該のparamPrefixと前方一致するパラメータのみbeanにマップされます。- Parameters:
paramPrefix
-- Returns:
- BeanParamMapper自身のインスタンス
-
whitelistPropertyNameRegex
設定可能なプロパティ名表現の正規表現を設定します。 正規表現によるチェックは、paramPrefixを取り除いた後に実施されるため、 正規表現には、paramPrefixは省いた形で指定します。- Parameters:
whitelistPropertyNameRegex
-- Returns:
- BeanParamMapper自身のインスタンス
-
indexedPropertySizeLimit
autoGrowが有効化されている場合、List、配列、Mapにおいて自動拡張する最大サイズを設定します。- Parameters:
indexedPropertySizeLimit
-- Returns:
- BeanParamMapper自身のインスタンス
-
typeConversionError
型変換に失敗した場合のエラーメッセージをカスタマイズするなどの処理を行う場合、セットします。 例)BeanParamMapper mapper = new BeanParamMapper().typeConversionError(e -> e.addMessage("データの変換に失敗しました"))
- Parameters:
typeConversionErrorHandler
- 引数のMappingErrorに対して、メッセージ等をセットするロジックを記述する- Returns:
- BeanParamMapper自身のインスタンス
-
isTrim
public boolean isTrim() -
setTrim
public void setTrim(boolean trim) -
isEmptyToNull
public boolean isEmptyToNull() -
setEmptyToNull
public void setEmptyToNull(boolean emptyToNull) -
isAutoGrow
public boolean isAutoGrow() -
setAutoGrow
public void setAutoGrow(boolean autoGrow) -
getWithValidation
public boolean getWithValidation() -
setWithValidation
public void setWithValidation(boolean withValidation) -
getPropertyDelimiter
public char getPropertyDelimiter() -
setPropertyDelimiter
public void setPropertyDelimiter(char propertyDelimiter) -
getIndexPrefix
public char getIndexPrefix() -
setIndexPrefix
public void setIndexPrefix(char indexPrefix) -
getIndexPostfix
public char getIndexPostfix() -
setIndexPostfix
public void setIndexPostfix(char indexPostfix) -
getIndexedPropertySizeLimit
public int getIndexedPropertySizeLimit() -
setIndexedPropertySizeLimit
public void setIndexedPropertySizeLimit(int indexedPropertySizeLimit) -
getParamPrefix
-
setParamPrefix
-
getWhitelistPropertyNameRegex
-
setWhitelistPropertyNameRegex
-
getTypeConversionErrorHandler
-
setTypeConversionErrorHandler
-
populate
public void populate(Object bean, Map<String, Object> params, Class<?>... validationGroups) throws MappingException指定のbeanに、paramsで指定されるパラメータをセットします。- Parameters:
bean
-params
-validationGroups
- validationを行う場合(withValidation=true)、BeanValidaitonのvalidationGroupsを指定可能- Throws:
MappingException
- マッピング処理時に型変換エラー、Validationエラーが発生した場合スロー
-
validate
明示的に指定のbeanに対してValidationを実行します。- Parameters:
bean
-validationGroups
- BeanValidaitonのvalidationGroupsを指定可能- Throws:
MappingException
- Validationエラーが発生した場合スロー
-