Repository: wicket Updated Branches: refs/heads/master a5a9ee1bb -> 09fc316b7
WICKET-5692: improved Unresolvable Property Message Project: http://git-wip-us.apache.org/repos/asf/wicket/repo Commit: http://git-wip-us.apache.org/repos/asf/wicket/commit/09fc316b Tree: http://git-wip-us.apache.org/repos/asf/wicket/tree/09fc316b Diff: http://git-wip-us.apache.org/repos/asf/wicket/diff/09fc316b Branch: refs/heads/master Commit: 09fc316b768968f99c2a80bda1dbaee7a596eb12 Parents: a5a9ee1 Author: Thibault Kruse <thibault.kr...@comsysto.com> Authored: Mon Sep 22 22:08:19 2014 +0200 Committer: Martin Tzvetanov Grigorov <mgrigo...@apache.org> Committed: Mon Sep 22 22:48:11 2014 +0200 ---------------------------------------------------------------------- .../bean/validation/PropertyValidator.java | 44 +++++++++++++++++--- .../PropertyValidatorRequiredTest.java | 24 +++++++++-- 2 files changed, 59 insertions(+), 9 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/wicket/blob/09fc316b/wicket-bean-validation/src/main/java/org/apache/wicket/bean/validation/PropertyValidator.java ---------------------------------------------------------------------- diff --git a/wicket-bean-validation/src/main/java/org/apache/wicket/bean/validation/PropertyValidator.java b/wicket-bean-validation/src/main/java/org/apache/wicket/bean/validation/PropertyValidator.java index ea1976a..838dbd8 100644 --- a/wicket-bean-validation/src/main/java/org/apache/wicket/bean/validation/PropertyValidator.java +++ b/wicket-bean-validation/src/main/java/org/apache/wicket/bean/validation/PropertyValidator.java @@ -18,6 +18,8 @@ import org.apache.wicket.behavior.Behavior; import org.apache.wicket.markup.ComponentTag; import org.apache.wicket.markup.html.form.FormComponent; import org.apache.wicket.model.IModel; +import org.apache.wicket.model.IPropertyReflectionAwareModel; +import org.apache.wicket.model.IWrapModel; import org.apache.wicket.model.PropertyModel; import org.apache.wicket.validation.IValidatable; import org.apache.wicket.validation.IValidator; @@ -92,18 +94,48 @@ public class PropertyValidator<T> extends Behavior implements IValidator<T> this.groups_ = groups; } + /** + * To support debugging, trying to provide useful information where possible + * @return + */ + private String createUnresolvablePropertyMessage(FormComponent<T> component) { + String baseMessage = "Could not resolve Bean Property from component: " + component + + ". (Hints:) Possible causes are a typo in the PropertyExpression, a null reference or a model that does not work in combination with a " + + IPropertyResolver.class.getSimpleName() + "."; + + IModel<?> model = component.getModel(); + // Code sadly copied over from DefaultPropertyResolver + while (true) + { + if (model == null) + { + break; + } + if (model instanceof IPropertyReflectionAwareModel) + { + break; + } + if (model instanceof IWrapModel<?>) + { + model = ((IWrapModel<?>)model).getWrappedModel(); + continue; + } + } + if (model != null) { + baseMessage += " Model : " + model; + } + return baseMessage; + } + private Property getProperty() { if (property_ == null) { - property_ = BeanValidationConfiguration.get().resolveProperty(component); + BeanValidationContext config = BeanValidationConfiguration.get(); + property_ = config.resolveProperty(component); if (property_ == null) { - throw new IllegalStateException( - "Could not resolve Property from component: " + component - + ". Either specify the Property in the constructor or use a model that works in combination with a " - + IPropertyResolver.class.getSimpleName() - + " to resolve the Property automatically"); + throw new IllegalStateException(createUnresolvablePropertyMessage(component)); } } return property_; http://git-wip-us.apache.org/repos/asf/wicket/blob/09fc316b/wicket-bean-validation/src/test/java/org/apache/wicket/bean/validation/PropertyValidatorRequiredTest.java ---------------------------------------------------------------------- diff --git a/wicket-bean-validation/src/test/java/org/apache/wicket/bean/validation/PropertyValidatorRequiredTest.java b/wicket-bean-validation/src/test/java/org/apache/wicket/bean/validation/PropertyValidatorRequiredTest.java index 8edea4c..805a5cf 100644 --- a/wicket-bean-validation/src/test/java/org/apache/wicket/bean/validation/PropertyValidatorRequiredTest.java +++ b/wicket-bean-validation/src/test/java/org/apache/wicket/bean/validation/PropertyValidatorRequiredTest.java @@ -3,6 +3,10 @@ package org.apache.wicket.bean.validation; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; +import java.util.Arrays; +import java.util.List; + +import javax.validation.Valid; import javax.validation.constraints.NotNull; import org.apache.wicket.MarkupContainer; @@ -66,6 +70,8 @@ public class PropertyValidatorRequiredTest assertFalse(page.input19.isRequired()); assertFalse(page.input20.isRequired()); + assertTrue(page.input21.isRequired()); + } /** @@ -100,7 +106,7 @@ public class PropertyValidatorRequiredTest private TestBean bean = new TestBean(); private FormComponent<String> input1, input2, input3, input4, input5, input6, input7, input8, input9, input10, input11, input12, input13, input14, input15, input16, input17, - input18, input19, input20; + input18, input19, input20, input21; public TestPage() { @@ -155,9 +161,12 @@ public class PropertyValidatorRequiredTest input20 = new TextField<String>("input20", new PropertyModel<String>(this, "bean.propertyOneTwo")).add(new PropertyValidator<String>(GroupThree.class)); + input21 = new TextField<String>("input21", new PropertyModel<String>(this, + "bean.subBeanList[0].property")).add(new PropertyValidator<>()); + form.add(input1, input2, input3, input4, input5, input6, input7, input8, input9, input10, input11, input12, input13, input14, input15, input16, input17, input18, - input19, input20); + input19, input20, input21); } @@ -166,7 +175,7 @@ public class PropertyValidatorRequiredTest Class<?> containerClass) { return new StringResourceStream( - "<form wicket:id='form'><input wicket:id='input1'/><input wicket:id='input2'/><input wicket:id='input3'/><input wicket:id='input4'/><input wicket:id='input5'/><input wicket:id='input6'/><input wicket:id='input7'/><input wicket:id='input8'/><input wicket:id='input9'/><input wicket:id='input10'/><input wicket:id='input11'/><input wicket:id='input12'/><input wicket:id='input13'/><input wicket:id='input14'/><input wicket:id='input15'/><input wicket:id='input16'/><input wicket:id='input17'/><input wicket:id='input18'/><input wicket:id='input19'/><input wicket:id='input20'/></form>"); + "<form wicket:id='form'><input wicket:id='input1'/><input wicket:id='input2'/><input wicket:id='input3'/><input wicket:id='input4'/><input wicket:id='input5'/><input wicket:id='input6'/><input wicket:id='input7'/><input wicket:id='input8'/><input wicket:id='input9'/><input wicket:id='input10'/><input wicket:id='input11'/><input wicket:id='input12'/><input wicket:id='input13'/><input wicket:id='input14'/><input wicket:id='input15'/><input wicket:id='input16'/><input wicket:id='input17'/><input wicket:id='input18'/><input wicket:id='input19'/><input wicket:id='input20'/><input wicket:id='input21'/></form>"); } } @@ -183,8 +192,17 @@ public class PropertyValidatorRequiredTest { } + public static class TestContainedBean { + @NotNull + String property; + } + public static class TestBean { + @Valid + @NotNull + List<TestContainedBean> subBeanList = Arrays.asList(new TestContainedBean()); + @NotNull String property;