diff --git a/org.springframework.context/src/main/java/org/springframework/ui/binding/Binder.java b/org.springframework.context/src/main/java/org/springframework/ui/binding/Binder.java index 2696ee9294e..973ed78137d 100644 --- a/org.springframework.context/src/main/java/org/springframework/ui/binding/Binder.java +++ b/org.springframework.context/src/main/java/org/springframework/ui/binding/Binder.java @@ -21,6 +21,7 @@ import java.util.Map; * Binds user-entered values to properties of a model object. * @author Keith Donald * @since 3.0 + * @see #addBinding(String) * @see #getBinding(String) * @see #bind(Map) */ @@ -31,6 +32,26 @@ public interface Binder { */ Object getModel(); + /** + * Add a binding to a model property. + * The property may be a path to a member property like "name", or a nested property like "address.city" or "addresses.city". + * If the property path is nested and traverses a collection or Map, do not use indexes. + * The property path should express the model-class property structure like addresses.city, not an object structure like addresses[0].city. + * Examples: + *
+ * name - bind to property 'name'
+ * addresses - bind to property 'addresses', presumably a List<Address> e.g. allowing property expressions like addresses={ 12345 Macy Lane, 1977 Bel Aire Estates } and addresses[0]=12345 Macy Lane
+ * addresses.city - bind to property 'addresses.city', for all indexed addresses in the collection e.g. allowing property expressions like addresses[0].city=Melbourne
+ * address.city - bind to property 'address.city'
+ * favoriteFoodByFoodGroup - bind to property 'favoriteFoodByFoodGroup', presumably a Map; e.g. allowing favoriteFoodByFoodGroup={ DAIRY=Milk, MEAT=Steak } and favoriteFoodByFoodGroup['DAIRY']=Milk
+ * favoriteFoodByFoodGroup.name - bind to property 'favoriteFoodByFoodGroup.name', for all keyed Foods in the map; e.g. allowing favoriteFoodByFoodGroup['DAIRY'].name=Milk
+ *
+ * @param propertyPath the model property path
+ * @return a BindingConfiguration object, allowing additional configuration of the newly added binding
+ * @throws IllegalArgumentException if no such property path exists on the model
+ */
+ public BindingConfiguration addBinding(String propertyPath);
+
/**
* Get a binding to a model property..
* @param property the property path
diff --git a/org.springframework.context/src/main/java/org/springframework/ui/binding/support/BindingConfiguration.java b/org.springframework.context/src/main/java/org/springframework/ui/binding/BindingConfiguration.java
similarity index 91%
rename from org.springframework.context/src/main/java/org/springframework/ui/binding/support/BindingConfiguration.java
rename to org.springframework.context/src/main/java/org/springframework/ui/binding/BindingConfiguration.java
index c74f091ea74..81420e6890b 100644
--- a/org.springframework.context/src/main/java/org/springframework/ui/binding/support/BindingConfiguration.java
+++ b/org.springframework.context/src/main/java/org/springframework/ui/binding/BindingConfiguration.java
@@ -13,12 +13,13 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.springframework.ui.binding.support;
+package org.springframework.ui.binding;
+import org.springframework.ui.binding.support.GenericBinder;
import org.springframework.ui.format.Formatter;
/**
- * A fluent interface for configuring a newly added binding to a property path.
+ * A fluent interface for configuring a newly added binding.
* @author Keith Donald
* @see GenericBinder#addBinding(String)
*/
diff --git a/org.springframework.context/src/main/java/org/springframework/ui/binding/support/DefaultBindingConfiguration.java b/org.springframework.context/src/main/java/org/springframework/ui/binding/support/DefaultBindingConfiguration.java
index dadcfe735a7..308af77d892 100644
--- a/org.springframework.context/src/main/java/org/springframework/ui/binding/support/DefaultBindingConfiguration.java
+++ b/org.springframework.context/src/main/java/org/springframework/ui/binding/support/DefaultBindingConfiguration.java
@@ -15,6 +15,7 @@
*/
package org.springframework.ui.binding.support;
+import org.springframework.ui.binding.BindingConfiguration;
import org.springframework.ui.format.Formatter;
final class DefaultBindingConfiguration implements BindingConfiguration {
diff --git a/org.springframework.context/src/main/java/org/springframework/ui/binding/support/GenericBinder.java b/org.springframework.context/src/main/java/org/springframework/ui/binding/support/GenericBinder.java
index ee7845c7211..f898d2204c4 100644
--- a/org.springframework.context/src/main/java/org/springframework/ui/binding/support/GenericBinder.java
+++ b/org.springframework.context/src/main/java/org/springframework/ui/binding/support/GenericBinder.java
@@ -55,6 +55,7 @@ import org.springframework.ui.alert.Alert;
import org.springframework.ui.alert.Severity;
import org.springframework.ui.binding.Binder;
import org.springframework.ui.binding.Binding;
+import org.springframework.ui.binding.BindingConfiguration;
import org.springframework.ui.binding.BindingResult;
import org.springframework.ui.binding.BindingResults;
import org.springframework.ui.binding.MissingSourceValuesException;
@@ -84,7 +85,7 @@ public class GenericBinder implements Binder {
private Object model;
- private Set