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:
committed by
Oliver Gierke
parent
357b7db85a
commit
050227adcc
@@ -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;
|
||||
|
||||
|
||||
@@ -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));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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");
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user