From 218a820c9520f3683545bb80a0f632c2b4b63cc2 Mon Sep 17 00:00:00 2001 From: Oliver Gierke Date: Thu, 12 Jun 2014 15:59:57 +0200 Subject: [PATCH] DATACMNS-520 - Fixed @Param validation in Parameters. Parameters erroneously rejected @Param annotated query method parameters that were preceded by a non-bindable type (like Pageable or Sort) as it checked for a 0 index of the parameter. We now manually keep an index in the check itself and have removed the Parameter.isFirst() method as it's not used anywhere else. --- .../data/repository/query/Parameter.java | 9 --------- .../data/repository/query/Parameters.java | 5 ++++- .../data/repository/query/ParametersUnitTests.java | 12 +++++++++++- 3 files changed, 15 insertions(+), 11 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 124214b2a..31ab13218 100644 --- a/src/main/java/org/springframework/data/repository/query/Parameter.java +++ b/src/main/java/org/springframework/data/repository/query/Parameter.java @@ -50,15 +50,6 @@ public class Parameter { this.parameter = parameter; } - /** - * Returns whether the {@link Parameter} is the first one. - * - * @return - */ - boolean isFirst() { - return getIndex() == 0; - } - /** * Returns whether the parameter is a special parameter. * diff --git a/src/main/java/org/springframework/data/repository/query/Parameters.java b/src/main/java/org/springframework/data/repository/query/Parameters.java index 24340cd55..4fddb60c5 100644 --- a/src/main/java/org/springframework/data/repository/query/Parameters.java +++ b/src/main/java/org/springframework/data/repository/query/Parameters.java @@ -258,15 +258,18 @@ public abstract class Parameters, T extends Parameter private void assertEitherAllParamAnnotatedOrNone() { boolean nameFound = false; + int index = 0; for (T parameter : this.getBindableParameters()) { if (parameter.isNamedParameter()) { - Assert.isTrue(nameFound || parameter.isFirst(), ALL_OR_NOTHING); + Assert.isTrue(nameFound || index == 0, ALL_OR_NOTHING); nameFound = true; } else { Assert.isTrue(!nameFound, ALL_OR_NOTHING); } + + index++; } } 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 11d16cb6d..902b38dbe 100644 --- a/src/test/java/org/springframework/data/repository/query/ParametersUnitTests.java +++ b/src/test/java/org/springframework/data/repository/query/ParametersUnitTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2008-2013 the original author or authors. + * Copyright 2008-2014 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of @@ -115,6 +115,14 @@ public class ParametersUnitTests { assertThat(parameters.getSortIndex(), is(1)); } + /** + * @see DATACMNS-520 + */ + @Test + public void doesNotRejectParameterIfPageableComesFirst() throws Exception { + getParametersFor("validWithPageableFirst", Pageable.class, String.class); + } + private Parameters getParametersFor(String methodName, Class... parameterTypes) throws SecurityException, NoSuchMethodException { @@ -135,6 +143,8 @@ public class ParametersUnitTests { User validWithPageable(@Param("username") String username, Pageable pageable); + User validWithPageableFirst(Pageable pageable, @Param("username") String username); + User validWithSort(@Param("username") String username, Sort sort); User validWithSortFirst(Sort sort, String username);