|
|
|
@ -30,8 +30,8 @@ import org.springframework.util.Assert; |
|
|
|
* A base {@link Binder binder} implementation designed for subclassing. |
|
|
|
* A base {@link Binder binder} implementation designed for subclassing. |
|
|
|
* @author Keith Donald |
|
|
|
* @author Keith Donald |
|
|
|
* @since 3.0 |
|
|
|
* @since 3.0 |
|
|
|
* @see #setMessageSource(MessageSource) |
|
|
|
|
|
|
|
* @see #setRequiredFields(String[]) |
|
|
|
* @see #setRequiredFields(String[]) |
|
|
|
|
|
|
|
* @see #setMessageSource(MessageSource) |
|
|
|
* @see #bind(Map) |
|
|
|
* @see #bind(Map) |
|
|
|
*/ |
|
|
|
*/ |
|
|
|
public abstract class AbstractBinder implements Binder { |
|
|
|
public abstract class AbstractBinder implements Binder { |
|
|
|
@ -40,6 +40,15 @@ public abstract class AbstractBinder implements Binder { |
|
|
|
|
|
|
|
|
|
|
|
private MessageSource messageSource; |
|
|
|
private MessageSource messageSource; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
|
|
|
* Configure the fields for which values must be present in each bind attempt. |
|
|
|
|
|
|
|
* @param fieldNames the required field names |
|
|
|
|
|
|
|
* @see MissingFieldException |
|
|
|
|
|
|
|
*/ |
|
|
|
|
|
|
|
public void setRequiredFields(String[] fieldNames) { |
|
|
|
|
|
|
|
this.requiredFields = fieldNames; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
/** |
|
|
|
* Configure the MessageSource that resolves localized {@link BindingResult} alert messages. |
|
|
|
* Configure the MessageSource that resolves localized {@link BindingResult} alert messages. |
|
|
|
* @param messageSource the message source |
|
|
|
* @param messageSource the message source |
|
|
|
@ -49,15 +58,6 @@ public abstract class AbstractBinder implements Binder { |
|
|
|
this.messageSource = messageSource; |
|
|
|
this.messageSource = messageSource; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
|
|
|
* Configure the fields for which values must be present in each bind attempt. |
|
|
|
|
|
|
|
* @param fieldNames the field names |
|
|
|
|
|
|
|
* @see MissingFieldException |
|
|
|
|
|
|
|
*/ |
|
|
|
|
|
|
|
public void setRequiredFields(String[] fieldNames) { |
|
|
|
|
|
|
|
this.requiredFields = fieldNames; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// implementing Binder
|
|
|
|
// implementing Binder
|
|
|
|
|
|
|
|
|
|
|
|
public BindingResults bind(Map<String, ? extends Object> fieldValues) { |
|
|
|
public BindingResults bind(Map<String, ? extends Object> fieldValues) { |
|
|
|
@ -65,21 +65,21 @@ public abstract class AbstractBinder implements Binder { |
|
|
|
checkRequired(fieldValues); |
|
|
|
checkRequired(fieldValues); |
|
|
|
ArrayListBindingResults results = new ArrayListBindingResults(fieldValues.size()); |
|
|
|
ArrayListBindingResults results = new ArrayListBindingResults(fieldValues.size()); |
|
|
|
for (Map.Entry<String, ? extends Object> fieldValue : fieldValues.entrySet()) { |
|
|
|
for (Map.Entry<String, ? extends Object> fieldValue : fieldValues.entrySet()) { |
|
|
|
results.add(bind(fieldValue)); |
|
|
|
results.add(bindField(fieldValue.getKey(), fieldValue.getValue())); |
|
|
|
} |
|
|
|
} |
|
|
|
return results; |
|
|
|
return results; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// subclassing hooks
|
|
|
|
// subclassing hooks
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
/** |
|
|
|
* Hook subclasses may use to filter the source values to bind. |
|
|
|
* Hook subclasses may use to filter the source values to bind. |
|
|
|
* This hook allows the binder to pre-process the field values before binding occurs. |
|
|
|
* This hook allows the binder to pre-process the field values before binding occurs. |
|
|
|
* For example, a Binder might insert empty or default values for fields that are not present. |
|
|
|
* For example, a Binder might insert empty or default values for fields that are not present. |
|
|
|
* As another example, a Binder might collapse multiple source values into a single source value. |
|
|
|
* As another example, a Binder might collapse multiple source values into a single source value. |
|
|
|
* @param fieldValues the original fieldValues map provided by the caller |
|
|
|
* Default implementation simply returns the fieldValues Map unchanged. |
|
|
|
* @return the filtered fieldValues map that will be used to bind |
|
|
|
* @param fieldValues the original fieldValues Map provided by the caller |
|
|
|
|
|
|
|
* @return the filtered fieldValues Map that will be used to bind |
|
|
|
*/ |
|
|
|
*/ |
|
|
|
protected Map<String, ? extends Object> filter(Map<String, ? extends Object> fieldValues) { |
|
|
|
protected Map<String, ? extends Object> filter(Map<String, ? extends Object> fieldValues) { |
|
|
|
return fieldValues; |
|
|
|
return fieldValues; |
|
|
|
@ -93,11 +93,12 @@ public abstract class AbstractBinder implements Binder { |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
/** |
|
|
|
* Hook method subclasses should override to perform a single binding. |
|
|
|
* Hook method subclasses override to perform a single field binding. |
|
|
|
* @param fieldValue the field value to bind |
|
|
|
* @param name the field name |
|
|
|
|
|
|
|
* @param value the field value |
|
|
|
* @return the binding result |
|
|
|
* @return the binding result |
|
|
|
*/ |
|
|
|
*/ |
|
|
|
protected abstract BindingResult bind(Map.Entry<String, ? extends Object> fieldValue); |
|
|
|
protected abstract BindingResult bindField(String name, Object value); |
|
|
|
|
|
|
|
|
|
|
|
// internal helpers
|
|
|
|
// internal helpers
|
|
|
|
|
|
|
|
|
|
|
|
|