You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@wicket.apache.org by pe...@apache.org on 2017/02/13 05:16:03 UTC

[1/2] wicket git commit: WICKET-6313 simplified IPropertyExpressionResolver, keeping one CachingPropertyLocator per OGNLPropertyExpressionResolver instance, javadoc

Repository: wicket
Updated Branches:
  refs/heads/WICKET-6318-configurable-property-expression-resolver 3a6db1bf7 -> fa0f12624


WICKET-6313 simplified IPropertyExpressionResolver, keeping one CachingPropertyLocator per OGNLPropertyExpressionResolver instance, javadoc


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

Branch: refs/heads/WICKET-6318-configurable-property-expression-resolver
Commit: ede069b9b9617eb96b1705ab3515cc5ebe530279
Parents: 3a6db1b
Author: Pedro Henrique Oliveira dos Santos <pe...@apache.org>
Authored: Mon Feb 13 03:13:53 2017 -0200
Committer: Pedro Henrique Oliveira dos Santos <pe...@apache.org>
Committed: Mon Feb 13 03:13:53 2017 -0200

----------------------------------------------------------------------
 .../util/lang/IPropertyExpressionResolver.java  | 31 +++++++++-
 .../core/util/lang/IPropertyResolver.java       |  8 +++
 .../lang/OGNLPropertyExpressionResolver.java    | 63 +++++++-------------
 .../wicket/core/util/lang/PropertyResolver.java | 12 ++--
 .../util/parser/PropertyExpressionResolver.java | 13 +---
 .../OGNLPropertyExpressionResolverTest.java     | 14 ++---
 6 files changed, 76 insertions(+), 65 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/wicket/blob/ede069b9/wicket-core/src/main/java/org/apache/wicket/core/util/lang/IPropertyExpressionResolver.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/core/util/lang/IPropertyExpressionResolver.java b/wicket-core/src/main/java/org/apache/wicket/core/util/lang/IPropertyExpressionResolver.java
index 18c8141..4574be2 100644
--- a/wicket-core/src/main/java/org/apache/wicket/core/util/lang/IPropertyExpressionResolver.java
+++ b/wicket-core/src/main/java/org/apache/wicket/core/util/lang/IPropertyExpressionResolver.java
@@ -1,12 +1,37 @@
 package org.apache.wicket.core.util.lang;
 
+import org.apache.wicket.core.util.reflection.ObjectWithGetAndSet;
+
+/**
+ * Resolves property expression to workable {@link ObjectWithGetAndSet}
+ * 
+ * @author pedro
+ */
 public interface IPropertyExpressionResolver
 {
 
-	<T> T getValue(String expression, T object);
-
-	<T> Class<T> getPropertyClass(String expression, Object object, Class<?> targetClass);
+	/**
+	 * @param expression
+	 * @param object
+	 *            Optional, but will enable the resolver to find subclasses in polymorphic types
+	 * @param clz
+	 * @return {@link ObjectWithGetAndSet}
+	 */
+	ObjectWithGetAndSet resolve(String expression, Object object, Class<? extends Object> clz);
 
+	/**
+	 * Creates a new value to each null property in the way to the expressed property. So the
+	 * property expression: "attr1.attr2.attr3" would have "attr1" and "attr2" tested for null, in
+	 * which case they would get new constructed values to guarantee a place to set the new value at
+	 * "attr3"
+	 * 
+	 * @param expression
+	 * @param object
+	 * @param value
+	 * @param prc
+	 */
+	// TODO find a better name, multiple values are being setting here
+	// TODO if possible, to move to PropertyExpression
 	void setValue(String expression, Object object, Object value, PropertyResolverConverter prc);
 
 }

http://git-wip-us.apache.org/repos/asf/wicket/blob/ede069b9/wicket-core/src/main/java/org/apache/wicket/core/util/lang/IPropertyResolver.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/core/util/lang/IPropertyResolver.java b/wicket-core/src/main/java/org/apache/wicket/core/util/lang/IPropertyResolver.java
index e72a29e..65b7cdb 100644
--- a/wicket-core/src/main/java/org/apache/wicket/core/util/lang/IPropertyResolver.java
+++ b/wicket-core/src/main/java/org/apache/wicket/core/util/lang/IPropertyResolver.java
@@ -2,6 +2,14 @@ package org.apache.wicket.core.util.lang;
 
 import org.apache.wicket.core.util.reflection.IGetAndSet;
 
+/**
+ * Resolves a property string to an {@link IGetAndSet}.
+ * 
+ * @see {@link IPropertyExpressionResolver} Property expression are resolved by
+ *      {@link IPropertyExpressionResolver} implementations instead
+ *
+ * @author pedro
+ */
 public interface IPropertyResolver
 {
 

http://git-wip-us.apache.org/repos/asf/wicket/blob/ede069b9/wicket-core/src/main/java/org/apache/wicket/core/util/lang/OGNLPropertyExpressionResolver.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/core/util/lang/OGNLPropertyExpressionResolver.java b/wicket-core/src/main/java/org/apache/wicket/core/util/lang/OGNLPropertyExpressionResolver.java
index 76f5814..085adb3 100644
--- a/wicket-core/src/main/java/org/apache/wicket/core/util/lang/OGNLPropertyExpressionResolver.java
+++ b/wicket-core/src/main/java/org/apache/wicket/core/util/lang/OGNLPropertyExpressionResolver.java
@@ -26,8 +26,6 @@ import org.apache.wicket.core.util.reflection.CachingPropertyLocator;
 import org.apache.wicket.core.util.reflection.IGetAndSet;
 import org.apache.wicket.core.util.reflection.ObjectWithGetAndSet;
 import org.apache.wicket.util.string.Strings;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 /**
  * This class parses expressions to lookup or set a value on the object that is given. <br/>
@@ -65,15 +63,11 @@ import org.slf4j.LoggerFactory;
 
 public class OGNLPropertyExpressionResolver implements IPropertyExpressionResolver
 {
-
-	/** Log. */
-	private static final Logger log = LoggerFactory.getLogger(PropertyResolver.class);
-
 	private final static int RETURN_NULL = 0;
 	private final static int CREATE_NEW_VALUE = 1;
 	private final static int RESOLVE_CLASS = 2;
 
-	private static IPropertyResolver locator = new CachingPropertyLocator( new DefaultPropertyLocator());
+	private IPropertyResolver locator = new CachingPropertyLocator( new DefaultPropertyLocator());
 
 
 	/**
@@ -86,14 +80,9 @@ public class OGNLPropertyExpressionResolver implements IPropertyExpressionResolv
 	 *            The object which is evaluated.
 	 * @return The value that is evaluated. Null something in the expression evaluated to null.
 	 */
-	@Override
-	public  Object getValue(final String expression, final Object object)
+	//TODO remove, only being used in tests
+	public Object getValue(final String expression, final Object object)
 	{
-		if (expression == null || expression.equals("") || object == null)
-		{
-			return object;
-		}
-
 		ObjectWithGetAndSet objectWithGetAndSet = getObjectWithGetAndSet(expression, object,
 			RETURN_NULL);
 		if (objectWithGetAndSet == null)
@@ -152,27 +141,6 @@ public class OGNLPropertyExpressionResolver implements IPropertyExpressionResolv
 	}
 
 	/**
-	 * @param <T>
-	 * @param expression
-	 * @param clz
-	 * @return class of the target Class property expression
-	 * @throws WicketRuntimeException
-	 *             if class cannot be resolved
-	 */
-	@Override
-	@SuppressWarnings("unchecked")
-	public <T> Class<T> getPropertyClass(final String expression, Object object, final Class<?> clz)
-	{
-		ObjectWithGetAndSet objectWithGetAndSet = getObjectWithGetAndSet(expression, object,
-			RESOLVE_CLASS, clz);
-		if (objectWithGetAndSet == null)
-		{
-			throw new WicketRuntimeException("No Class returned for expression: " + expression
-				+ " for getting the target class of: " + clz);
-		}
-		return (Class<T>)objectWithGetAndSet.getTargetClass();
-	}
-
 	/**
 	 * @param expression
 	 * @param object
@@ -180,7 +148,7 @@ public class OGNLPropertyExpressionResolver implements IPropertyExpressionResolv
 	 * @throws WicketRuntimeException
 	 *             if there is no such field
 	 */
-	public static Field getPropertyField(final String expression, final Object object)
+	public Field getPropertyField(final String expression, final Object object)
 	{
 		ObjectWithGetAndSet objectWithGetAndSet = getObjectWithGetAndSet(expression, object,
 			RESOLVE_CLASS);
@@ -199,7 +167,7 @@ public class OGNLPropertyExpressionResolver implements IPropertyExpressionResolv
 	 * @throws WicketRuntimeException
 	 *             if there is no getter method
 	 */
-	public static Method getPropertyGetter(final String expression, final Object object)
+	public Method getPropertyGetter(final String expression, final Object object)
 	{
 		ObjectWithGetAndSet objectWithGetAndSet = getObjectWithGetAndSet(expression, object,
 			RESOLVE_CLASS);
@@ -218,7 +186,7 @@ public class OGNLPropertyExpressionResolver implements IPropertyExpressionResolv
 	 * @throws WicketRuntimeException
 	 *             if there is no setter method
 	 */
-	public static Method getPropertySetter(final String expression, final Object object)
+	public Method getPropertySetter(final String expression, final Object object)
 	{
 		ObjectWithGetAndSet objectWithGetAndSet = getObjectWithGetAndSet(expression, object,
 			RESOLVE_CLASS);
@@ -230,6 +198,19 @@ public class OGNLPropertyExpressionResolver implements IPropertyExpressionResolv
 		return objectWithGetAndSet.getSetter();
 	}
 
+	@Override
+	public ObjectWithGetAndSet resolve(String expression, Object object, Class<? extends Object> clz)
+	{
+		ObjectWithGetAndSet objectWithGetAndSet = getObjectWithGetAndSet(expression, object,
+			RESOLVE_CLASS, clz);
+		if (objectWithGetAndSet == null)
+		{
+			throw new WicketRuntimeException("Null object returned for expression: " + expression
+				+ " for getting the target class of: " + clz);
+		}
+		return objectWithGetAndSet;
+	}
+
 	/**
 	 * Just delegating the call to the original getObjectAndGetSetter passing the object type as
 	 * parameter.
@@ -239,7 +220,7 @@ public class OGNLPropertyExpressionResolver implements IPropertyExpressionResolv
 	 * @param tryToCreateNull
 	 * @return {@link ObjectWithGetAndSet}
 	 */
-	private static ObjectWithGetAndSet getObjectWithGetAndSet(final String expression,
+	private ObjectWithGetAndSet getObjectWithGetAndSet(final String expression,
 		final Object object, int tryToCreateNull)
 	{
 		return getObjectWithGetAndSet(expression, object, tryToCreateNull, object.getClass());
@@ -260,7 +241,7 @@ public class OGNLPropertyExpressionResolver implements IPropertyExpressionResolv
 	 * @return final getAndSet and the target to apply it on, or {@code null} if expression results
 	 *         in an intermediate null
 	 */
-	private static ObjectWithGetAndSet getObjectWithGetAndSet(final String expression,
+	private ObjectWithGetAndSet getObjectWithGetAndSet(final String expression,
 		final Object object, final int tryToCreateNull, Class<?> clz)
 	{
 		String expressionBracketsSeperated = Strings.replaceAll(expression, "[", ".[").toString();
@@ -376,7 +357,7 @@ public class OGNLPropertyExpressionResolver implements IPropertyExpressionResolv
 		return -1;
 	}
 
-	private static IGetAndSet getGetAndSet(String exp, final Class<?> clz)
+	private IGetAndSet getGetAndSet(String exp, final Class<?> clz)
 	{
 
 		IGetAndSet getAndSet = locator.get(clz, exp);

http://git-wip-us.apache.org/repos/asf/wicket/blob/ede069b9/wicket-core/src/main/java/org/apache/wicket/core/util/lang/PropertyResolver.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/core/util/lang/PropertyResolver.java b/wicket-core/src/main/java/org/apache/wicket/core/util/lang/PropertyResolver.java
index ad4063f..b7f87dc 100644
--- a/wicket-core/src/main/java/org/apache/wicket/core/util/lang/PropertyResolver.java
+++ b/wicket-core/src/main/java/org/apache/wicket/core/util/lang/PropertyResolver.java
@@ -27,15 +27,19 @@ public final class PropertyResolver
 
 	public static <T> T getValue(String expression, T object)
 	{
-		return Application.get().getApplicationSettings().getPropertyExpressionResolver()
-			.getValue(expression, object);
+		if (expression == null || expression.equals("") || object == null)
+		{
+			return object;
+		}
+		IPropertyExpressionResolver propertyExpressionResolver = Application.get().getApplicationSettings().getPropertyExpressionResolver();
+		return (T)propertyExpressionResolver.resolve(expression, object, object.getClass()).getValue();
 	}
 
 	public static <T> Class<T> getPropertyClass(String expression, Object object,
 		Class<?> targetClass)
 	{
-		return Application.get().getApplicationSettings().getPropertyExpressionResolver()
-			.getPropertyClass(expression, object, targetClass);
+		IPropertyExpressionResolver propertyExpressionResolver = Application.get().getApplicationSettings().getPropertyExpressionResolver();
+		return (Class<T>)propertyExpressionResolver.resolve(expression, object, targetClass).getTargetClass();
 	}
 
 	public static void setValue(String expression, Object object, Object value,

http://git-wip-us.apache.org/repos/asf/wicket/blob/ede069b9/wicket-core/src/main/java/org/apache/wicket/core/util/parser/PropertyExpressionResolver.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/core/util/parser/PropertyExpressionResolver.java b/wicket-core/src/main/java/org/apache/wicket/core/util/parser/PropertyExpressionResolver.java
index 22049d2..fd976aa 100644
--- a/wicket-core/src/main/java/org/apache/wicket/core/util/parser/PropertyExpressionResolver.java
+++ b/wicket-core/src/main/java/org/apache/wicket/core/util/parser/PropertyExpressionResolver.java
@@ -2,27 +2,20 @@ package org.apache.wicket.core.util.parser;
 
 import org.apache.wicket.core.util.lang.IPropertyExpressionResolver;
 import org.apache.wicket.core.util.lang.PropertyResolverConverter;
+import org.apache.wicket.core.util.reflection.ObjectWithGetAndSet;
 
 public class PropertyExpressionResolver implements IPropertyExpressionResolver
 {
-
 	@Override
-	public <T> T getValue(String expression, T object)
+	public ObjectWithGetAndSet resolve(String expression, Object object, Class<? extends Object> clz)
 	{
 		return null;
 	}
 
 	@Override
-	public <T> Class<T> getPropertyClass(String expression, Object object, Class<?> targetClass)
+	public void setValue(String expression, Object object, Object value, PropertyResolverConverter prc)
 	{
-		return null;
-	}
 
-	@Override
-	public void setValue(String expression, Object object, Object value,
-		PropertyResolverConverter prc)
-	{
-		
 	}
 
 }

http://git-wip-us.apache.org/repos/asf/wicket/blob/ede069b9/wicket-core/src/test/java/org/apache/wicket/util/lang/OGNLPropertyExpressionResolverTest.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/test/java/org/apache/wicket/util/lang/OGNLPropertyExpressionResolverTest.java b/wicket-core/src/test/java/org/apache/wicket/util/lang/OGNLPropertyExpressionResolverTest.java
index f371496..6168142 100644
--- a/wicket-core/src/test/java/org/apache/wicket/util/lang/OGNLPropertyExpressionResolverTest.java
+++ b/wicket-core/src/test/java/org/apache/wicket/util/lang/OGNLPropertyExpressionResolverTest.java
@@ -457,20 +457,20 @@ public class OGNLPropertyExpressionResolverTest extends WicketTestCase
 	{
 		Address address = new Address();
 
-		Class<?> clazz = ognlResolver.getPropertyClass("number", address, address.getClass());
+		Class<?> clazz = ognlResolver.resolve("number", address, address.getClass()).getTargetClass();
 		assertEquals(int.class, clazz);
 
 		Person person = new Person();
 		person.setAddress(new Address());
 
-		clazz = ognlResolver.getPropertyClass("address.number", person, person.getClass());
+		clazz = ognlResolver.resolve("address.number", person, person.getClass()).getTargetClass();
 		assertEquals(int.class, clazz);
 
 		person.setAddressArray(new Address[] { new Address(), new Address() });
-		clazz = ognlResolver.getPropertyClass("addressArray[0]", person, person.getClass());
+		clazz = ognlResolver.resolve("addressArray[0]", person, person.getClass()).getTargetClass();
 		assertEquals(Address.class, clazz);
 
-		clazz = ognlResolver.getPropertyClass("addressArray[0].number", person, person.getClass());
+		clazz = ognlResolver.resolve("addressArray[0].number", person, person.getClass()).getTargetClass();
 		assertEquals(int.class, clazz);
 	}
 
@@ -605,10 +605,10 @@ public class OGNLPropertyExpressionResolverTest extends WicketTestCase
 	{
 		Person person = new Person();
 		assertEquals(String.class,
-			ognlResolver.getPropertyClass("country.name", person, person.getClass()));
+			ognlResolver.resolve("country.name", person, person.getClass()).getTargetClass());
 		try
 		{
-			ognlResolver.getPropertyClass("country.subCountry.name", person, person.getClass());
+			ognlResolver.resolve("country.subCountry.name", person, person.getClass()).getTargetClass();
 			fail("country.subCountry shouldnt be found");
 		}
 		catch (Exception e)
@@ -616,7 +616,7 @@ public class OGNLPropertyExpressionResolverTest extends WicketTestCase
 
 		}
 		person.setCountry(new Country2("test", new Country("test")));
-		ognlResolver.getPropertyClass("country.subCountry.name", person, person.getClass());
+		ognlResolver.resolve("country.subCountry.name", person, person.getClass()).getTargetClass();
 	}
 
 	/**


[2/2] wicket git commit: WICKET-6313 updating wicket-bean-validation project to use the new property resolution api

Posted by pe...@apache.org.
WICKET-6313 updating wicket-bean-validation project to use the new property resolution api


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

Branch: refs/heads/WICKET-6318-configurable-property-expression-resolver
Commit: fa0f12624c97e99a37f2fbe0f9b8e41215bedb1f
Parents: ede069b
Author: Pedro Henrique Oliveira dos Santos <pe...@apache.org>
Authored: Mon Feb 13 03:15:44 2017 -0200
Committer: Pedro Henrique Oliveira dos Santos <pe...@apache.org>
Committed: Mon Feb 13 03:15:44 2017 -0200

----------------------------------------------------------------------
 .../validation/DefaultPropertyResolver.java     | 26 ++++++++----
 .../bean/validation/IPropertyResolver.java      |  1 -
 .../bean/validation/PropertyValidator.java      |  2 +-
 .../validation/ValidationModelResolver.java     |  8 ++--
 .../validation/ValidationModelResolverTest.java | 44 --------------------
 5 files changed, 23 insertions(+), 58 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/wicket/blob/fa0f1262/wicket-bean-validation/src/main/java/org/apache/wicket/bean/validation/DefaultPropertyResolver.java
----------------------------------------------------------------------
diff --git a/wicket-bean-validation/src/main/java/org/apache/wicket/bean/validation/DefaultPropertyResolver.java b/wicket-bean-validation/src/main/java/org/apache/wicket/bean/validation/DefaultPropertyResolver.java
index 527a24f..174598a 100644
--- a/wicket-bean-validation/src/main/java/org/apache/wicket/bean/validation/DefaultPropertyResolver.java
+++ b/wicket-bean-validation/src/main/java/org/apache/wicket/bean/validation/DefaultPropertyResolver.java
@@ -1,13 +1,16 @@
 package org.apache.wicket.bean.validation;
 
+import java.lang.reflect.Field;
+import java.lang.reflect.Method;
+
+import org.apache.wicket.Application;
 import org.apache.wicket.WicketRuntimeException;
+import org.apache.wicket.core.util.lang.IPropertyExpressionResolver;
+import org.apache.wicket.core.util.reflection.ObjectWithGetAndSet;
 import org.apache.wicket.markup.html.form.FormComponent;
-import org.apache.wicket.model.IPropertyReflectionAwareModel;
+import org.apache.wicket.model.AbstractPropertyModel;
 import org.apache.wicket.model.PropertyModel;
 
-import java.lang.reflect.Field;
-import java.lang.reflect.Method;
-
 /**
  * Default property resolver. This resolver supports common Wicket models like the
  * {@link PropertyModel}, and other implementations of {@link IPropertyReflectionAwareModel}
@@ -21,16 +24,23 @@ public class DefaultPropertyResolver implements IPropertyResolver
 	@Override
 	public Property resolveProperty(FormComponent<?> component)
 	{
-		IPropertyReflectionAwareModel<?> delegate = ValidationModelResolver.resolvePropertyModelFrom(component);
+		AbstractPropertyModel<?> delegate = ValidationModelResolver.resolvePropertyModelFrom(component);
 		if (delegate == null)
 		{
 			return null;
 		}
+		Object target = delegate.getInnermostModelOrObject();
+		if(target == null)
+			return null;
 		
-		String name;
-		Method getter = delegate.getPropertyGetter();
+		String expression = delegate.getPropertyExpression();
+		IPropertyExpressionResolver propertyExpressionResolver = Application.get().getApplicationSettings().getPropertyExpressionResolver();
+		ObjectWithGetAndSet objectWithGetAndSet = propertyExpressionResolver.resolve(expression, target, target.getClass());
+
+		Method getter = objectWithGetAndSet.getGetter();
 		if (getter != null)
 		{
+			String name;
 			String methodName = getter.getName();
 			if (methodName.startsWith("get"))
 			{
@@ -50,7 +60,7 @@ public class DefaultPropertyResolver implements IPropertyResolver
 			return new Property(getter.getDeclaringClass(), name);
 		}
 
-		Field field = delegate.getPropertyField();
+		Field field = objectWithGetAndSet.getField();
 		if (field != null)
 		{
 			return new Property(field.getDeclaringClass(), field.getName());

http://git-wip-us.apache.org/repos/asf/wicket/blob/fa0f1262/wicket-bean-validation/src/main/java/org/apache/wicket/bean/validation/IPropertyResolver.java
----------------------------------------------------------------------
diff --git a/wicket-bean-validation/src/main/java/org/apache/wicket/bean/validation/IPropertyResolver.java b/wicket-bean-validation/src/main/java/org/apache/wicket/bean/validation/IPropertyResolver.java
index dabe39f..c761527 100644
--- a/wicket-bean-validation/src/main/java/org/apache/wicket/bean/validation/IPropertyResolver.java
+++ b/wicket-bean-validation/src/main/java/org/apache/wicket/bean/validation/IPropertyResolver.java
@@ -1,7 +1,6 @@
 package org.apache.wicket.bean.validation;
 
 import org.apache.wicket.markup.html.form.FormComponent;
-import org.apache.wicket.model.IPropertyReflectionAwareModel;
 
 /**
  * Resolves the property to be validated for the given form component. Implementations, incuding the

http://git-wip-us.apache.org/repos/asf/wicket/blob/fa0f1262/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 862a69b..1dc3cea 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
@@ -100,7 +100,7 @@ public class PropertyValidator<T> extends Behavior implements IValidator<T>
 		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 = ValidationModelResolver.resolvePropertyModelFrom(component);
+        IModel<?> model = component.getInnermostModel();
 		if (model != null) {
 			baseMessage += " Model : " + model;
 		}

http://git-wip-us.apache.org/repos/asf/wicket/blob/fa0f1262/wicket-bean-validation/src/main/java/org/apache/wicket/bean/validation/ValidationModelResolver.java
----------------------------------------------------------------------
diff --git a/wicket-bean-validation/src/main/java/org/apache/wicket/bean/validation/ValidationModelResolver.java b/wicket-bean-validation/src/main/java/org/apache/wicket/bean/validation/ValidationModelResolver.java
index cb8cfcd..a452776 100644
--- a/wicket-bean-validation/src/main/java/org/apache/wicket/bean/validation/ValidationModelResolver.java
+++ b/wicket-bean-validation/src/main/java/org/apache/wicket/bean/validation/ValidationModelResolver.java
@@ -1,8 +1,8 @@
 package org.apache.wicket.bean.validation;
 
 import org.apache.wicket.markup.html.form.FormComponent;
+import org.apache.wicket.model.AbstractPropertyModel;
 import org.apache.wicket.model.IModel;
-import org.apache.wicket.model.IPropertyReflectionAwareModel;
 import org.apache.wicket.model.IWrapModel;
 
 /**
@@ -19,7 +19,7 @@ final class ValidationModelResolver
      *
      * @return property-aware model, extracted from supplied component or <code>null</code>
      */
-    public static IPropertyReflectionAwareModel<?> resolvePropertyModelFrom(FormComponent<?> component)
+    public static AbstractPropertyModel<?> resolvePropertyModelFrom(FormComponent<?> component)
     {
         IModel<?> model = component.getModel();
         while (true)
@@ -28,9 +28,9 @@ final class ValidationModelResolver
             {
                 return null;
             }
-            if (model instanceof IPropertyReflectionAwareModel)
+            if (model instanceof AbstractPropertyModel)
             {
-                return (IPropertyReflectionAwareModel<?>) model;
+                return (AbstractPropertyModel<?>) model;
             }
             if (model instanceof IWrapModel<?>)
             {

http://git-wip-us.apache.org/repos/asf/wicket/blob/fa0f1262/wicket-bean-validation/src/test/java/org/apache/wicket/bean/validation/ValidationModelResolverTest.java
----------------------------------------------------------------------
diff --git a/wicket-bean-validation/src/test/java/org/apache/wicket/bean/validation/ValidationModelResolverTest.java b/wicket-bean-validation/src/test/java/org/apache/wicket/bean/validation/ValidationModelResolverTest.java
deleted file mode 100644
index cefb2e9..0000000
--- a/wicket-bean-validation/src/test/java/org/apache/wicket/bean/validation/ValidationModelResolverTest.java
+++ /dev/null
@@ -1,44 +0,0 @@
-package org.apache.wicket.bean.validation;
-
-import org.apache.wicket.markup.html.form.TextField;
-import org.apache.wicket.model.IPropertyReflectionAwareModel;
-import org.apache.wicket.model.Model;
-import org.apache.wicket.model.PropertyModel;
-import org.apache.wicket.util.tester.WicketTesterScope;
-import org.junit.Assert;
-import org.junit.Rule;
-import org.junit.Test;
-
-/**
- * @author alexander.v.morozov
- */
-public class ValidationModelResolverTest
-{
-
-    @Rule
-    public WicketTesterScope scope = new WicketTesterScope();
-
-    @Test
-    public void noModelBoundToComponent()
-    {
-        TextField<String> textField = new TextField<String>("field");
-        Assert.assertNull(ValidationModelResolver.resolvePropertyModelFrom(textField));
-    }
-
-    @Test
-    public void simpleModelBoundToComponent()
-    {
-        TextField<String> textField = new TextField<String>("text", new Model<String>());
-        Assert.assertNull(ValidationModelResolver.resolvePropertyModelFrom(textField));
-    }
-
-    @Test
-    public void propertyModelBoundToComponent()
-    {
-        TextField<String> textField = new TextField<String>("text", new PropertyModel<String>(new TestValidatableBean(), "text"));
-        IPropertyReflectionAwareModel<?> model = ValidationModelResolver.resolvePropertyModelFrom(textField);
-        Assert.assertNotNull(model);
-        Assert.assertEquals("text", model.getPropertyField().getName());
-    }
-
-}
\ No newline at end of file