public class DataBinder extends ObjectSE implements PropertyEditorRegistry, TypeConverter
許可されたフィールドの配列の設定に失敗すると、セキュリティに影響する可能性があることに注意してください。たとえば、HTTP フォームの POST データの場合、悪意のあるクライアントは、フォームに存在しないフィールドまたはプロパティの値を提供することにより、アプリケーションの破壊を試みることができます。場合によっては、これによりコマンドオブジェクトまたはネストされたオブジェクトに不正なデータが設定される可能性があります。このため、DataBinder で allowedFields
プロパティを指定することを強くお勧めします。
バインディング結果は、BindingResult
インターフェースを介して調べることができ、Errors
インターフェースを継承します: getBindingResult()
メソッドを参照してください。不足しているフィールドとプロパティアクセス例外は、次のエラーコードを使用して、Errors インスタンスで収集された FieldErrors
に変換されます。
デフォルトでは、バインディングエラーは BindingErrorProcessor
ストラテジー、欠落フィールドおよびプロパティアクセス例外の処理を通じて解決されます。setBindingErrorProcessor(org.springframework.validation.BindingErrorProcessor)
メソッドを参照してください。必要に応じて、たとえば異なるエラーコードを生成するために、デフォルトの戦略をオーバーライドできます。
その後、カスタム検証エラーを追加できます。通常、このようなエラーコードを適切なユーザーに表示されるエラーメッセージに解決する必要があります。これは、MessageSource
を介して各エラーを解決することで実現できます。MessageSource
は、MessageSource.getMessage(org.springframework.context.MessageSourceResolvable, java.util.Locale)
メソッドにより ObjectError
/FieldError
を解決できます。メッセージコードのリストは、MessageCodesResolver
戦略を通じてカスタマイズできます。setMessageCodesResolver(org.springframework.validation.MessageCodesResolver)
メソッドを参照してください。DefaultMessageCodesResolver
の javadoc は、デフォルトの解決規則の詳細を述べています。
この汎用データバインダーは、あらゆる種類の環境で使用できます。
setAllowedFields(java.lang.String...)
, setRequiredFields(java.lang.String...)
, registerCustomEditor(java.lang.Class<?>, java.beans.PropertyEditor)
, setMessageCodesResolver(org.springframework.validation.MessageCodesResolver)
, setBindingErrorProcessor(org.springframework.validation.BindingErrorProcessor)
, bind(org.springframework.beans.PropertyValues)
, getBindingResult()
, DefaultMessageCodesResolver
, DefaultBindingErrorProcessor
, MessageSource
修飾子と型 | フィールドと説明 |
---|---|
static int | DEFAULT_AUTO_GROW_COLLECTION_LIMIT 配列とコレクションの増加に対するデフォルトの制限: 256 |
static StringSE | DEFAULT_OBJECT_NAME バインディングに使用されるデフォルトのオブジェクト名: 「ターゲット」 |
protected static Log | logger 多くの DataBinder インスタンスを作成します。静的ロガーを使用しましょう。 |
コンストラクターと説明 |
---|
DataBinder(ObjectSE target) デフォルトのオブジェクト名で、新しい DataBinder インスタンスを作成します。 |
DataBinder(ObjectSE target, StringSE objectName) 新しい DataBinder インスタンスを作成します。 |
修飾子と型 | メソッドと説明 |
---|---|
void | addCustomFormatter(Formatter<?> formatter) カスタムフォーマッターを追加し、 Formatter -declared 型に一致するすべてのフィールドに適用します。 |
void | addCustomFormatter(Formatter<?> formatter, ClassSE<?>... fieldTypes) カスタムフォーマッターを追加し、指定されたフィールド型(存在する場合のみ)に適用するか、 Formatter -declared 型に一致するすべてのフィールドに適用します。 |
void | addCustomFormatter(Formatter<?> formatter, StringSE... fields) Formatter クラスで指定されたフィールド型のカスタムフォーマッタを追加し、指定されたフィールドのみ(存在する場合)に適用するか、そうでなければすべてのフィールドに適用します。 |
void | addValidators(Validator... validators) 各バインディングステップの後に適用するバリデーターを追加します。 |
protected void | applyPropertyValues(MutablePropertyValues mpvs) 指定されたプロパティ値をターゲットオブジェクトに適用します。 |
void | bind(PropertyValues pvs) 指定されたプロパティ値をこのバインダーのターゲットにバインドします。 |
protected void | checkAllowedFields(MutablePropertyValues mpvs) 許可されたフィールドに対して特定のプロパティ値を確認し、許可されていないフィールドの値を削除します。 |
protected void | checkRequiredFields(MutablePropertyValues mpvs) 必要なフィールドに対して指定されたプロパティ値を確認し、必要に応じて欠落フィールドエラーを生成します。 |
MapSE<?,?> | close() この DataBinder を閉じると、エラーが発生した場合に BindException がスローされる可能性があります。 |
<T> T | convertIfNecessary(ObjectSE value, ClassSE<T> requiredType) 値を必要な型に変換します(必要に応じて、String から)。 |
<T> T | convertIfNecessary(ObjectSE value, ClassSE<T> requiredType, FieldSE field) 値を必要な型に変換します(必要に応じて、String から)。 |
<T> T | convertIfNecessary(ObjectSE value, ClassSE<T> requiredType, MethodParameter methodParam) 値を必要な型に変換します(必要に応じて、String から)。 |
protected AbstractPropertyBindingResult | createBeanPropertyBindingResult() 標準の JavaBean プロパティアクセスを使用して AbstractPropertyBindingResult インスタンスを作成します。 |
protected AbstractPropertyBindingResult | createDirectFieldBindingResult() 直接フィールドアクセスを使用して AbstractPropertyBindingResult インスタンスを作成します。 |
protected void | doBind(MutablePropertyValues mpvs) 渡された MutablePropertyValues インスタンスと連携する、バインディングプロセスの実際の実装。 |
PropertyEditorSE | findCustomEditor(ClassSE<?> requiredType, StringSE propertyPath) 指定された型とプロパティのカスタムプロパティエディターを見つけます。 |
StringSE[] | getAllowedFields() バインドを許可するフィールドを返します。 |
int | getAutoGrowCollectionLimit() 配列およびコレクションの自動拡張の現在の制限を返します。 |
BindingErrorProcessor | getBindingErrorProcessor() バインディングエラーを処理するための戦略を返します。 |
BindingResult | getBindingResult() この DataBinder によって作成された BindingResult インスタンスを返します。 |
ConversionService | getConversionService() 関連する ConversionService があれば、それを返します。 |
StringSE[] | getDisallowedFields() バインドを許可しないフィールドを返します。 |
protected AbstractPropertyBindingResult | getInternalBindingResult() この DataBinder が保持している内部 BindingResult を AbstractPropertyBindingResult として返します。 |
StringSE | getObjectName() バインドされたオブジェクトの名前を返します。 |
protected ConfigurablePropertyAccessor | getPropertyAccessor() このバインダーの BindingResult の基になる PropertyAccessor を返します。 |
protected PropertyEditorRegistry | getPropertyEditorRegistry() このバインダーの BindingResult の基になる TypeConverter を返します。 |
StringSE[] | getRequiredFields() 各バインディングプロセスに必要なフィールドを返します。 |
protected SimpleTypeConverter | getSimpleTypeConverter() このバインダーの基になる SimpleTypeConverter を返します。 |
ObjectSE | getTarget() ラップされたターゲットオブジェクトを返します。 |
protected TypeConverter | getTypeConverter() このバインダーの BindingResult の基になる TypeConverter を返します。 |
Validator | getValidator() 各バインディングステップの後に適用するプライマリバリデータを返します(ある場合)。 |
ListSE<Validator> | getValidators() データバインディング後に適用するバリデーターを返します。 |
void | initBeanPropertyAccess() この DataBinder の標準 JavaBean プロパティアクセスを初期化します。 |
void | initDirectFieldAccess() デフォルトの Bean プロパティアクセスの代替として、この DataBinder の直接フィールドアクセスを初期化します。 |
protected boolean | isAllowed(StringSE field) 指定されたフィールドがバインドを許可されている場合に戻ります。 |
boolean | isAutoGrowNestedPaths() ネストされたパスの「自動拡張」がアクティブになっているかどうかを返します。 |
boolean | isIgnoreInvalidFields() バインド時に無効なフィールドを無視するかどうかを返します。 |
boolean | isIgnoreUnknownFields() バインド時に不明なフィールドを無視するかどうかを返します。 |
void | registerCustomEditor(ClassSE<?> requiredType, PropertyEditorSE propertyEditor) 指定された型のすべてのプロパティに対して、指定されたカスタムプロパティエディターを登録します。 |
void | registerCustomEditor(ClassSE<?> requiredType, StringSE field, PropertyEditorSE propertyEditor) 指定された型とプロパティ、または指定された型のすべてのプロパティに対して、指定されたカスタムプロパティエディターを登録します。 |
void | replaceValidators(Validator... validators) 各バインディングステップの後に適用するバリデーターを置き換えます。 |
void | setAllowedFields(StringSE... allowedFields) バインドを許可するフィールドを登録します。 |
void | setAutoGrowCollectionLimit(int autoGrowCollectionLimit) 配列およびコレクションの自動拡張の制限を指定します。 |
void | setAutoGrowNestedPaths(boolean autoGrowNestedPaths) このバインダーが null 値を含むネストされたパスを「自動拡張」しようとするかどうかを設定します。 |
void | setBindingErrorProcessor(BindingErrorProcessor bindingErrorProcessor) バインディングエラーの処理に使用する戦略、つまり、必須フィールドエラーと PropertyAccessException を設定します。 |
void | setConversionService(ConversionService conversionService) JavaBeans PropertyEditors の代わりに、プロパティ値の変換に使用する Spring 3.0 ConversionService を指定します。 |
void | setDisallowedFields(StringSE... disallowedFields) バインドを許可しないフィールドを登録します。 |
void | setIgnoreInvalidFields(boolean ignoreInvalidFields) 無効なフィールドを無視するかどうか、つまり、アクセスできないターゲットオブジェクトに対応するフィールドを持つバインドパラメーターを無視するかどうかを設定します(たとえば、ネストされたパスの null 値のため)。 |
void | setIgnoreUnknownFields(boolean ignoreUnknownFields) 不明なフィールドを無視するかどうか、つまり、ターゲットオブジェクトに対応するフィールドがないバインドパラメーターを無視するかどうかを設定します。 |
void | setMessageCodesResolver(MessageCodesResolver messageCodesResolver) エラーをメッセージコードに解決するために使用する戦略を設定します。 |
void | setRequiredFields(StringSE... requiredFields) 各バインディングプロセスに必要なフィールドを登録します。 |
void | setValidator(Validator validator) 各バインディングステップの後に適用するように Validator を設定します。 |
void | validate() 指定されたバリデータがある場合は呼び出します。 |
void | validate(ObjectSE... validationHints) 指定された検証ヒントがあれば、指定された検証ヒントを呼び出します。 |
cloneSE, equalsSE, finalizeSE, getClassSE, hashCodeSE, notifySE, notifyAllSE, toStringSE, waitSE, waitSE, waitSE
public static final StringSE DEFAULT_OBJECT_NAME
public static final int DEFAULT_AUTO_GROW_COLLECTION_LIMIT
protected static final Log logger
public DataBinder(@Nullable ObjectSE target)
target
- バインドするターゲットオブジェクト (または、バインダーが単なるパラメーター値の変換に使用される場合は null
)DEFAULT_OBJECT_NAME
public StringSE getObjectName()
public void setAutoGrowNestedPaths(boolean autoGrowNestedPaths)
"true" の場合、null パスの場所にはデフォルトのオブジェクト値が入力され、例外が発生する代わりにトラバースされます。このフラグは、範囲外のインデックスにアクセスするときにコレクション要素の自動成長も有効にします。
標準の DataBinder では、デフォルトは "true" です。Spring 4.1 以降、この機能は Bean プロパティアクセス(DataBinder のデフォルトモード)およびフィールドアクセスでサポートされています。
public boolean isAutoGrowNestedPaths()
public void setAutoGrowCollectionLimit(int autoGrowCollectionLimit)
デフォルトは 256 で、大きなインデックスの場合に OutOfMemoryErrors を防ぎます。自動成長のニーズが異常に高い場合は、この制限を上げます。
public int getAutoGrowCollectionLimit()
public void initBeanPropertyAccess()
これがデフォルトです。明示的な呼び出しは、先行初期化につながります。
protected AbstractPropertyBindingResult createBeanPropertyBindingResult()
AbstractPropertyBindingResult
インスタンスを作成します。public void initDirectFieldAccess()
protected AbstractPropertyBindingResult createDirectFieldBindingResult()
AbstractPropertyBindingResult
インスタンスを作成します。protected AbstractPropertyBindingResult getInternalBindingResult()
protected ConfigurablePropertyAccessor getPropertyAccessor()
protected SimpleTypeConverter getSimpleTypeConverter()
protected PropertyEditorRegistry getPropertyEditorRegistry()
protected TypeConverter getTypeConverter()
public BindingResult getBindingResult()
Errors
, bind(org.springframework.beans.PropertyValues)
public void setIgnoreUnknownFields(boolean ignoreUnknownFields)
デフォルトは "true" です。これをオフにすると、すべてのバインドパラメーターに、ターゲットオブジェクトに一致するフィールドが必要になります。
この設定は、この DataBinder のバインディング操作にのみ適用され、BindingResult
を介した値の取得には適用されないことに注意してください。
public boolean isIgnoreUnknownFields()
public void setIgnoreInvalidFields(boolean ignoreInvalidFields)
デフォルトは "false" です。これをオンにすると、ターゲットオブジェクトグラフの存在しない部分にネストされたオブジェクトのバインドパラメーターが無視されます。
この設定は、この DataBinder のバインディング操作にのみ適用され、BindingResult
を介した値の取得には適用されないことに注意してください。
public boolean isIgnoreInvalidFields()
public void setAllowedFields(@Nullable StringSE... allowedFields)
"xxx*"、"*xxx"、"*xxx*" パターンをサポートします。isAllowed
メソッドをオーバーライドすることにより、より高度なマッチングを実装できます。
または、 許可されていないフィールドのリストを指定します。
allowedFields
- フィールド名の配列 setDisallowedFields(java.lang.String...)
, isAllowed(String)
public void setDisallowedFields(@Nullable StringSE... disallowedFields)
"xxx*"、"*xxx"、"*xxx*" パターンをサポートします。isAllowed
メソッドをオーバーライドすることにより、より高度なマッチングを実装できます。
または、 許可されたフィールドのリストを指定します。
disallowedFields
- フィールド名の配列 setAllowedFields(java.lang.String...)
, isAllowed(String)
@Nullable public StringSE[] getDisallowedFields()
public void setRequiredFields(@Nullable StringSE... requiredFields)
指定されたフィールドのいずれかが受信プロパティ値のリストに含まれていない場合、対応する「フィールドがありません」エラーが作成され、エラーコード「必須」がデフォルトのバインドエラープロセッサーによって作成されます。
requiredFields
- フィールド名の配列 setBindingErrorProcessor(org.springframework.validation.BindingErrorProcessor)
, DefaultBindingErrorProcessor.MISSING_FIELD_ERROR_CODE
@Nullable public StringSE[] getRequiredFields()
public void setMessageCodesResolver(@Nullable MessageCodesResolver messageCodesResolver)
デフォルトは DefaultMessageCodesResolver です。
public void setBindingErrorProcessor(BindingErrorProcessor bindingErrorProcessor)
PropertyAccessException
を設定します。デフォルトは DefaultBindingErrorProcessor です。
public BindingErrorProcessor getBindingErrorProcessor()
public void setValidator(@Nullable Validator validator)
public void addValidators(Validator... validators)
public void replaceValidators(Validator... validators)
public void setConversionService(@Nullable ConversionService conversionService)
@Nullable public ConversionService getConversionService()
public void addCustomFormatter(Formatter<?> formatter)
Formatter
-declared 型に一致するすべてのフィールドに適用します。 対応する PropertyEditor
SE アダプターをカバーに登録します。
formatter
- 追加するフォーマッタ、特定の型に対して一般的に宣言された registerCustomEditor(Class, PropertyEditor)
public void addCustomFormatter(Formatter<?> formatter, StringSE... fields)
Formatter
クラスで指定されたフィールド型のカスタムフォーマッタを追加し、指定されたフィールドのみ(存在する場合)に適用するか、そうでなければすべてのフィールドに適用します。 対応する PropertyEditor
SE アダプターをカバーに登録します。
formatter
- 追加するフォーマッタ、特定の型に対して一般的に宣言された fields
- フォーマッタを適用するフィールド、またはすべてに適用する場合はなし registerCustomEditor(Class, String, PropertyEditor)
public void addCustomFormatter(Formatter<?> formatter, ClassSE<?>... fieldTypes)
Formatter
-declared 型に一致するすべてのフィールドに適用します。 対応する PropertyEditor
SE アダプターをカバーに登録します。
formatter
- 追加するフォーマッタ (フィールド型がパラメーターとして明示的に指定されている場合、フィールド型を総称的に宣言する必要はありません。)fieldTypes
- フォーマッタを適用するフィールド型、または指定された Formatter
実装クラスから派生する場合はなし registerCustomEditor(Class, PropertyEditor)
public void registerCustomEditor(ClassSE<?> requiredType, PropertyEditorSE propertyEditor)
PropertyEditorRegistry
PropertyEditorRegistry
の registerCustomEditor
requiredType
- プロパティの型 propertyEditor
- 登録するエディター public void registerCustomEditor(@Nullable ClassSE<?> requiredType, @Nullable StringSE field, PropertyEditorSE propertyEditor)
PropertyEditorRegistry
プロパティパスが配列またはコレクションプロパティを示す場合、エディターは配列 / コレクション自体(PropertyEditor
SE が配列またはコレクション値を作成する必要がある)または各要素(PropertyEditor
が要素型を作成する必要がある)のいずれかに適用されます。指定された必須型に応じて。
メモ: プロパティパスごとに 1 つの登録済みカスタムエディターのみがサポートされます。コレクション / 配列の場合、コレクション / 配列と同じプロパティの各要素の両方にエディターを登録しないでください。
たとえば、"items[n].quantity" (すべての値 n)のエディターを登録する場合は、このメソッドの "propertyPath" 引数の値として "items.quantity" を使用します。
PropertyEditorRegistry
の registerCustomEditor
requiredType
- プロパティの型。これは、プロパティが指定されている場合でも null
である可能性がありますが、特にコレクションの場合は特に指定する必要があります。エディター全体がコレクション自体に適用されるか、各エントリに適用されるかを明確にします。一般的なルールとして、Collection/array の場合は、ここで null
を指定しないでください! field
- プロパティのパス(名前またはネストされたパス)、または指定された型のすべてのプロパティのエディターを登録する場合は null
propertyEditor
- 登録するエディター @Nullable public PropertyEditorSE findCustomEditor(@Nullable ClassSE<?> requiredType, @Nullable StringSE propertyPath)
PropertyEditorRegistry
PropertyEditorRegistry
の findCustomEditor
requiredType
- プロパティの型 (プロパティが指定されている場合は null
にすることができますが、一貫性チェックのためにいずれにしても指定する必要があります)propertyPath
- プロパティのパス(名前またはネストされたパス)、または特定の型のすべてのプロパティのエディターを探している場合は null
null
@Nullable public <T> T convertIfNecessary(@Nullable ObjectSE value, @Nullable ClassSE<T> requiredType) throws TypeMismatchException
TypeConverter
String から任意の型への変換では、通常、PropertyEditor クラスの setAsText
メソッド、または ConversionService の Spring コンバーターを使用します。
TypeConverter
の convertIfNecessary
value
- 変換する値 requiredType
- 変換する必要がある型 (または null
(不明な場合、たとえばコレクション要素の場合))TypeMismatchException
- 型変換が失敗した場合 PropertyEditor.setAsText(String)
SE, PropertyEditor.getValue()
SE, ConversionService
, Converter
@Nullable public <T> T convertIfNecessary(@Nullable ObjectSE value, @Nullable ClassSE<T> requiredType, @Nullable MethodParameter methodParam) throws TypeMismatchException
TypeConverter
String から任意の型への変換では、通常、PropertyEditor クラスの setAsText
メソッド、または ConversionService の Spring コンバーターを使用します。
TypeConverter
の convertIfNecessary
value
- 変換する値 requiredType
- 変換する必要がある型 (または null
(不明な場合、たとえばコレクション要素の場合))methodParam
- 変換のターゲットであるメソッドパラメーター (ジェネリクス型の分析用。null
の場合があります)TypeMismatchException
- 型変換が失敗した場合 PropertyEditor.setAsText(String)
SE, PropertyEditor.getValue()
SE, ConversionService
, Converter
@Nullable public <T> T convertIfNecessary(@Nullable ObjectSE value, @Nullable ClassSE<T> requiredType, @Nullable FieldSE field) throws TypeMismatchException
TypeConverter
String から任意の型への変換では、通常、PropertyEditor クラスの setAsText
メソッド、または ConversionService の Spring コンバーターを使用します。
TypeConverter
の convertIfNecessary
value
- 変換する値 requiredType
- 変換する必要がある型 (または null
(不明な場合、たとえばコレクション要素の場合))field
- 変換のターゲットである反射フィールド (ジェネリクス型の分析用。null
の場合があります)TypeMismatchException
- 型変換が失敗した場合 PropertyEditor.setAsText(String)
SE, PropertyEditor.getValue()
SE, ConversionService
, Converter
public void bind(PropertyValues pvs)
この呼び出しにより、必須フィールド (コード「必須」) などの基本的なバインディングエラーや、値と Bean プロパティ (コード "typeMismatch" ) の型の不一致を表すフィールドエラーが発生する可能性があります。
指定された PropertyValues は使い捨てインスタンスである必要があることに注意してください。効率を上げるため、MutablePropertyValues インターフェースを実装する場合、許可されたフィールドのみを含むように変更されます。それ以外の場合、この目的のために内部可変コピーが作成されます。いずれの場合も元のインスタンスを変更しないでおくには、PropertyValues のコピーを渡します。
pvs
- バインドするプロパティ値 doBind(org.springframework.beans.MutablePropertyValues)
protected void doBind(MutablePropertyValues mpvs)
mpvs
- MutablePropertyValues インスタンスとしてバインドするプロパティ値 checkAllowedFields(org.springframework.beans.MutablePropertyValues)
, checkRequiredFields(org.springframework.beans.MutablePropertyValues)
, applyPropertyValues(org.springframework.beans.MutablePropertyValues)
protected void checkAllowedFields(MutablePropertyValues mpvs)
mpvs
- バインドされるプロパティ値 (変更可能)getAllowedFields()
, isAllowed(String)
protected boolean isAllowed(StringSE field)
デフォルトの実装では、指定された許可フィールドおよび禁止フィールドのリストで、"xxx*"、"*xxx"、"*xxx*" の一致、直接の同等性をチェックします。許可されていないパターンと一致するフィールドは、許可リスト内のパターンと一致する場合でも受け入れられません。
サブクラスでオーバーライドできます。
field
- チェックするフィールド setAllowedFields(java.lang.String...)
, setDisallowedFields(java.lang.String...)
, PatternMatchUtils.simpleMatch(String, String)
protected void checkRequiredFields(MutablePropertyValues mpvs)
mpvs
- バインドされるプロパティ値 (変更可能)getRequiredFields()
, getBindingErrorProcessor()
, BindingErrorProcessor.processMissingFieldError(java.lang.String, org.springframework.validation.BindingResult)
protected void applyPropertyValues(MutablePropertyValues mpvs)
デフォルトの実装では、提供されたすべてのプロパティ値が Bean プロパティ値として適用されます。デフォルトでは、不明なフィールドは無視されます。
public void validate()
public void validate(ObjectSE... validationHints)
メモ: 検証ヒントは、実際のターゲット Validator によって無視される場合があります。
validationHints
- SmartValidator
に渡される 1 つ以上のヒントオブジェクト setValidator(Validator)
, SmartValidator.validate(Object, Errors, Object...)
public MapSE<?,?> close() throws BindException
BindException
- バインド操作にエラーがあった場合 BindingResult.getModel()