From 174e9a6e93c7de687fa6acd0054c1f077e2da340 Mon Sep 17 00:00:00 2001 From: Oliver Gierke Date: Wed, 15 Jul 2015 16:18:37 +0200 Subject: [PATCH] DATACMNS-731 - Parameter now exposes whether it's named explicitly. Parameter now has a isExplicitlyNamed() to indicate whether the user explicitly assigned a name to it in contrast to an implicitly discovered parameter name. --- .../data/repository/query/Parameter.java | 10 ++++++ .../repository/query/ParametersUnitTests.java | 32 +++++++++++++++++-- 2 files changed, 40 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/springframework/data/repository/query/Parameter.java b/src/main/java/org/springframework/data/repository/query/Parameter.java index 31ab13218..9c9f3df6e 100644 --- a/src/main/java/org/springframework/data/repository/query/Parameter.java +++ b/src/main/java/org/springframework/data/repository/query/Parameter.java @@ -121,6 +121,16 @@ public class Parameter { return parameter.getParameterType(); } + /** + * Returns whether the parameter is named explicitly, i.e. annotated with {@link Param}. + * + * @return + * @since 1.11 + */ + public boolean isExplicitlyNamed() { + return parameter.hasParameterAnnotation(Param.class); + } + /* * (non-Javadoc) * @see java.lang.Object#toString() diff --git a/src/test/java/org/springframework/data/repository/query/ParametersUnitTests.java b/src/test/java/org/springframework/data/repository/query/ParametersUnitTests.java index 902b38dbe..be7e21df4 100644 --- a/src/test/java/org/springframework/data/repository/query/ParametersUnitTests.java +++ b/src/test/java/org/springframework/data/repository/query/ParametersUnitTests.java @@ -24,6 +24,7 @@ import org.junit.Before; import org.junit.Test; import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Sort; +import org.springframework.test.util.ReflectionTestUtils; /** * Unit test for {@link Parameters}. @@ -123,8 +124,35 @@ public class ParametersUnitTests { getParametersFor("validWithPageableFirst", Pageable.class, String.class); } - private Parameters getParametersFor(String methodName, Class... parameterTypes) throws SecurityException, - NoSuchMethodException { + /** + * @see DATACMNS-731 + */ + @Test + public void detectsExplicitlyNamedParameter() throws Exception { + + Parameter parameter = getParametersFor("valid", String.class).getBindableParameter(0); + + assertThat(parameter.getName(), is(notNullValue())); + assertThat(parameter.isExplicitlyNamed(), is(true)); + } + + /** + * @see DATACMNS-731 + */ + @Test + public void doesNotConsiderParameterExplicitlyNamedEvenIfNamePresent() throws Exception { + + Parameter parameter = getParametersFor("validWithSortFirst", Sort.class, String.class).getBindableParameter(0); + + Object methodParameter = ReflectionTestUtils.getField(parameter, "parameter"); + ReflectionTestUtils.setField(methodParameter, "parameterName", "name"); + + assertThat(parameter.getName(), is(notNullValue())); + assertThat(parameter.isExplicitlyNamed(), is(false)); + } + + private Parameters getParametersFor(String methodName, Class... parameterTypes) + throws SecurityException, NoSuchMethodException { Method method = SampleDao.class.getMethod(methodName, parameterTypes);