Repository: wicket
Updated Branches:
  refs/heads/wicket-6.x 6b906d53a -> 49aaea831


WICKET-5692: improved Unresolvable Property Message

(cherry picked from commit 09fc316b768968f99c2a80bda1dbaee7a596eb12)


Project: http://git-wip-us.apache.org/repos/asf/wicket/repo
Commit: http://git-wip-us.apache.org/repos/asf/wicket/commit/fe66a383
Tree: http://git-wip-us.apache.org/repos/asf/wicket/tree/fe66a383
Diff: http://git-wip-us.apache.org/repos/asf/wicket/diff/fe66a383

Branch: refs/heads/wicket-6.x
Commit: fe66a3836f87c7a98eb48a1c7432d4c7160036f3
Parents: 6b906d5
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:49:07 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/fe66a383/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 a2486c7..17aa38f 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;
@@ -93,18 +95,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/fe66a383/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 4b0ebd6..69186e4 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());
+
        }
        
        /**
@@ -101,7 +107,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()
                {
@@ -156,9 +162,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);
 
                }
 
@@ -167,7 +176,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>");
                }
 
        }
@@ -184,8 +193,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;
 

Reply via email to