public class BeanParamMapper
extends java.lang.Object
パラメータをBean、Entityにセットするためのユーティリティです。
Commandのインスタンスとして当BeanParamMapperのインスタンスを保持し、
Command.execute(RequestContext)
にて、#populate(Object, Map)
呼び出すことにより、 パラメータの値を格納可能です。
パラメータ名(formのinputタグのnameなど)にて、beanのどのプロパティに値をセットするかを指定します。デフォルトの設定では、以下のような命名規則が適用されます。
以下に、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メソッド内では設定変更は行わないでください。
修飾子とタイプ | フィールドと説明 |
---|---|
static char |
DEFAULT_INDEX_POSTFIX
デフォルトのindexPostfixです。
|
static char |
DEFAULT_INDEX_PREFIX
デフォルトのindexPrefixです。
|
static int |
DEFAULT_INDEXED_PROPERTY_SIZE_LIMIT
デフォルトのindexedPropertySizeLimitです。
|
static char |
DEFAULT_PROPERTY_DELIMITER
デフォルトのpropertyDelimiterです。
|
コンストラクタと説明 |
---|
BeanParamMapper() |
修飾子とタイプ | メソッドと説明 |
---|---|
BeanParamMapper |
delimiters(char propertyDelimiter,
char indexPrefix,
char indexPostfix)
パラメータ名のデリミタ表現を設定します。
|
BeanParamMapper |
enableAutoGrow()
ネストされたBean、List, 配列、Mapにおいて、パラメータ名で指定されるパスに値が存在しない場合、
自動的に拡張するように設定します。
|
BeanParamMapper |
enableEmptyToNull()
パラメータの値が空文字の場合、nullに変換するように設定します。
|
BeanParamMapper |
enableTrim()
パラメータの値がStringの場合、trimを行うように設定します。
|
int |
getIndexedPropertySizeLimit() |
char |
getIndexPostfix() |
char |
getIndexPrefix() |
java.lang.String |
getParamPrefix() |
char |
getPropertyDelimiter() |
java.util.function.Consumer<MappingError> |
getTypeConversionErrorHandler() |
java.lang.String |
getWhitelistPropertyNameRegex() |
boolean |
getWithValidation() |
BeanParamMapper |
indexedPropertySizeLimit(int indexedPropertySizeLimit)
autoGrowが有効化されている場合、List、配列、Mapにおいて自動拡張する最大サイズを設定します。
|
boolean |
isAutoGrow() |
boolean |
isEmptyToNull() |
boolean |
isTrim() |
BeanParamMapper |
paramPrefix(java.lang.String paramPrefix)
BeanMapperでbeanにマップするパラメータを限定するためのPrefixを設定します。
|
void |
populate(java.lang.Object bean,
java.util.Map<java.lang.String,java.lang.Object> params,
java.lang.Class<?>... validationGroups)
指定のbeanに、paramsで指定されるパラメータをセットします。
|
void |
setAutoGrow(boolean autoGrow) |
void |
setEmptyToNull(boolean emptyToNull) |
void |
setIndexedPropertySizeLimit(int indexedPropertySizeLimit) |
void |
setIndexPostfix(char indexPostfix) |
void |
setIndexPrefix(char indexPrefix) |
void |
setParamPrefix(java.lang.String paramPrefix) |
void |
setPropertyDelimiter(char propertyDelimiter) |
void |
setTrim(boolean trim) |
void |
setTypeConversionErrorHandler(java.util.function.Consumer<MappingError> typeConversionErrorHandler) |
void |
setWhitelistPropertyNameRegex(java.lang.String whitelistPropertyNameRegex) |
void |
setWithValidation(boolean withValidation) |
BeanParamMapper |
typeConversionError(java.util.function.Consumer<MappingError> typeConversionErrorHandler)
型変換に失敗した場合のエラーメッセージをカスタマイズするなどの処理を行う場合、セットします。
|
void |
validate(java.lang.Object bean,
java.lang.Class<?>... validationGroups)
明示的に指定のbeanに対してValidationを実行します。
|
BeanParamMapper |
whitelistPropertyNameRegex(java.lang.String whitelistPropertyNameRegex)
設定可能なプロパティ名表現の正規表現を設定します。
|
BeanParamMapper |
withValidation()
パラメータをBeanにセットする際に、BeanValidationによるバリデーションを行うように設定します。
|
public static final char DEFAULT_PROPERTY_DELIMITER
public static final char DEFAULT_INDEX_PREFIX
public static final char DEFAULT_INDEX_POSTFIX
public static final int DEFAULT_INDEXED_PROPERTY_SIZE_LIMIT
public BeanParamMapper withValidation()
public BeanParamMapper enableAutoGrow()
public BeanParamMapper enableTrim()
public BeanParamMapper enableEmptyToNull()
public BeanParamMapper delimiters(char propertyDelimiter, char indexPrefix, char indexPostfix)
propertyDelimiter
- ネストされたプロパティを指定する際の文字indexPrefix
- インデックス値を囲む先頭文字indexPostfix
- インデックス値を囲む接尾文字public BeanParamMapper paramPrefix(java.lang.String paramPrefix)
paramPrefix
- public BeanParamMapper whitelistPropertyNameRegex(java.lang.String whitelistPropertyNameRegex)
whitelistPropertyNameRegex
- public BeanParamMapper indexedPropertySizeLimit(int indexedPropertySizeLimit)
indexedPropertySizeLimit
- public BeanParamMapper typeConversionError(java.util.function.Consumer<MappingError> typeConversionErrorHandler)
BeanParamMapper mapper = new BeanParamMapper().typeConversionError(e -> e.addMessage("データの変換に失敗しました"))
typeConversionErrorHandler
- 引数のMappingErrorに対して、メッセージ等をセットするロジックを記述するpublic boolean isTrim()
public void setTrim(boolean trim)
public boolean isEmptyToNull()
public void setEmptyToNull(boolean emptyToNull)
public boolean isAutoGrow()
public void setAutoGrow(boolean autoGrow)
public boolean getWithValidation()
public void setWithValidation(boolean withValidation)
public char getPropertyDelimiter()
public void setPropertyDelimiter(char propertyDelimiter)
public char getIndexPrefix()
public void setIndexPrefix(char indexPrefix)
public char getIndexPostfix()
public void setIndexPostfix(char indexPostfix)
public int getIndexedPropertySizeLimit()
public void setIndexedPropertySizeLimit(int indexedPropertySizeLimit)
public java.lang.String getParamPrefix()
public void setParamPrefix(java.lang.String paramPrefix)
public java.lang.String getWhitelistPropertyNameRegex()
public void setWhitelistPropertyNameRegex(java.lang.String whitelistPropertyNameRegex)
public java.util.function.Consumer<MappingError> getTypeConversionErrorHandler()
public void setTypeConversionErrorHandler(java.util.function.Consumer<MappingError> typeConversionErrorHandler)
public void populate(java.lang.Object bean, java.util.Map<java.lang.String,java.lang.Object> params, java.lang.Class<?>... validationGroups) throws MappingException
bean
- params
- validationGroups
- validationを行う場合(withValidation=true)、BeanValidaitonのvalidationGroupsを指定可能MappingException
- マッピング処理時に型変換エラー、Validationエラーが発生した場合スローpublic void validate(java.lang.Object bean, java.lang.Class<?>... validationGroups) throws MappingException
bean
- validationGroups
- BeanValidaitonのvalidationGroupsを指定可能MappingException
- Validationエラーが発生した場合スロー