DATAJPA-1058 - Better exception when named method parameter is required but missing.

The exception now is a IllegalStateException, and mentions @Param as well as the -parameters compiler flag.

Origina pull request: #208.
This commit is contained in:
Jens Schauder
2017-07-24 12:59:22 +02:00
committed by Oliver Gierke
parent 357b7db85a
commit 050227adcc
4 changed files with 70 additions and 2 deletions

View File

@@ -32,6 +32,8 @@ import org.springframework.util.Assert;
*/
public class ParameterBinder {
static final String PARAMETER_NEEDS_TO_BE_NAMED = "For queries with named parameters you need to use provide names for method parameters. Use @Param for query method parameters, or when on Java 8+ use the javac flag -parameters.";
private final JpaParameters parameters;
private final Iterable<QueryParameterSetter> parameterSetters;

View File

@@ -202,6 +202,8 @@ abstract class QueryParameterSetterFactory {
@Override
public QueryParameterSetter create(ParameterBinding binding, String queryString) {
Assert.notNull(binding, "Binding must not be null.");
JpaParameter parameter = QueryUtils.hasNamedParameter(queryString) //
? findParameterForBinding(binding) //
: parameters.getBindableParameter(binding.getPosition() - 1);
@@ -223,7 +225,7 @@ abstract class QueryParameterSetterFactory {
}
private static String getName(JpaParameter p) {
return p.getName().orElseThrow(() -> new IllegalArgumentException("Parameter needs to be named!"));
return p.getName().orElseThrow(() -> new IllegalStateException(ParameterBinder.PARAMETER_NEEDS_TO_BE_NAMED));
}
}

View File

@@ -153,7 +153,7 @@ class StoredProcedureJpaQuery extends AbstractJpaQuery {
if (useNamedParameters) {
procedureQuery.registerStoredProcedureParameter(
param.getName().orElseThrow(() -> new IllegalArgumentException("Parameter needs to be named!")),
param.getName().orElseThrow(() -> new IllegalArgumentException(ParameterBinder.PARAMETER_NEEDS_TO_BE_NAMED)),
param.getType(), ParameterMode.IN);
} else {
procedureQuery.registerStoredProcedureParameter(param.getIndex() + 1, param.getType(), ParameterMode.IN);

View File

@@ -0,0 +1,64 @@
/*
* Copyright 2017 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 the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.springframework.data.jpa.repository.query;
import static org.mockito.Mockito.*;
import java.util.stream.Stream;
import org.assertj.core.api.Assertions;
import org.junit.Before;
import org.junit.Test;
import org.mockito.Mockito;
import org.springframework.data.jpa.repository.query.JpaParameters.JpaParameter;
import org.springframework.data.jpa.repository.query.StringQuery.ParameterBinding;
/**
* @author Jens Schauder
*/
public class QueryParameterSetterFactoryTest {
JpaParameters parameters = mock(JpaParameters.class, Mockito.RETURNS_DEEP_STUBS);
ParameterBinding binding = mock(ParameterBinding.class);
QueryParameterSetterFactory setterFactory;
@Before
public void before() {
// we have one bindable parameter
when(parameters.getBindableParameters().stream()).thenReturn(Stream.of(mock(JpaParameter.class)));
setterFactory = QueryParameterSetterFactory.basic(parameters);
}
@Test // DATAJPA-1058
public void noExceptionWhenQueryDoesNotContainNamedParameters() {
setterFactory.create(binding, "QueryStringWithOutNamedParameter");
}
@Test // DATAJPA-1058
public void exceptionWhenQueryContainNamedParametersAndMethodParametersAreNotNamed() {
Assertions.assertThatExceptionOfType(IllegalStateException.class) //
.isThrownBy(() -> setterFactory.create(binding, "QueryStringWith :NamedParameter")) //
.withMessageContaining("Java 8") //
.withMessageContaining("@Param") //
.withMessageContaining("-parameters");
}
}