diff --git a/src/main/java/org/springframework/data/querydsl/binding/QuerydslBindings.java b/src/main/java/org/springframework/data/querydsl/binding/QuerydslBindings.java
index e7eaad8a4..c10511df1 100644
--- a/src/main/java/org/springframework/data/querydsl/binding/QuerydslBindings.java
+++ b/src/main/java/org/springframework/data/querydsl/binding/QuerydslBindings.java
@@ -20,7 +20,6 @@ import lombok.RequiredArgsConstructor;
import lombok.Value;
import java.util.Arrays;
-import java.util.Collection;
import java.util.HashSet;
import java.util.LinkedHashMap;
import java.util.List;
@@ -37,7 +36,6 @@ import org.springframework.util.Assert;
import org.springframework.util.StringUtils;
import com.querydsl.core.types.Path;
-import com.querydsl.core.types.Predicate;
/**
* {@link QuerydslBindings} allows definition of path specific bindings.
@@ -478,7 +476,8 @@ public class QuerydslBindings {
public
> void first(SingleValueBinding
binding) {
Assert.notNull(binding, "Binding must not be null!");
- all((MultiValueBinding
) (path, value) -> Optionals.next(value.iterator()).flatMap(t -> binding.bind(path, t)));
+ all((MultiValueBinding
) (path, value) -> Optionals.next(value.iterator())
+ .flatMap(t -> binding.bind(path, t)));
}
/**
@@ -490,7 +489,7 @@ public class QuerydslBindings {
Assert.notNull(binding, "Binding must not be null!");
- QuerydslBindings.this.typeSpecs.put(type, PathAndBinding.withoutPath().with(binding));
+ QuerydslBindings.this.typeSpecs.put(type, PathAndBinding. withoutPath().with(binding));
}
}
diff --git a/src/main/java/org/springframework/data/querydsl/binding/QuerydslBindingsFactory.java b/src/main/java/org/springframework/data/querydsl/binding/QuerydslBindingsFactory.java
index f145a9349..244fdbb04 100644
--- a/src/main/java/org/springframework/data/querydsl/binding/QuerydslBindingsFactory.java
+++ b/src/main/java/org/springframework/data/querydsl/binding/QuerydslBindingsFactory.java
@@ -84,6 +84,30 @@ public class QuerydslBindingsFactory implements ApplicationContextAware {
return entityPathResolver;
}
+ /**
+ * Creates the {@link QuerydslBindings} to be used using for the given domain type. A {@link QuerydslBinderCustomizer}
+ * will be auto-detected.
+ *
+ * @param domainType must not be {@literal null}.
+ * @return will never be {@literal null}.
+ */
+ public QuerydslBindings createBindingsFor(TypeInformation> domainType) {
+ return createBindingsFor(domainType, Optional.empty());
+ }
+
+ /**
+ * Creates the {@link QuerydslBindings} to be used using for the given domain type and a pre-defined
+ * {@link QuerydslBinderCustomizer}.
+ *
+ * @param domainType must not be {@literal null}.
+ * @param customizer the {@link QuerydslBinderCustomizer} to use, must not be {@literal null}.
+ * @return will never be {@literal null}.
+ */
+ public QuerydslBindings createBindingsFor(TypeInformation> domainType,
+ Class extends QuerydslBinderCustomizer>> customizer) {
+ return createBindingsFor(domainType, Optional.of(customizer));
+ }
+
/**
* Creates the {@link QuerydslBindings} to be used using for the given domain type and a pre-defined
* {@link QuerydslBinderCustomizer}. If no customizer is given, auto-detection will be applied.
@@ -93,7 +117,7 @@ public class QuerydslBindingsFactory implements ApplicationContextAware {
* detection for the given domain type will be applied.
* @return
*/
- public QuerydslBindings createBindingsFor(TypeInformation> domainType,
+ private QuerydslBindings createBindingsFor(TypeInformation> domainType,
Optional>> customizer) {
Assert.notNull(customizer, "Customizer must not be null!");
@@ -141,7 +165,8 @@ public class QuerydslBindingsFactory implements ApplicationContextAware {
return customizer//
.filter(it -> !QuerydslBinderCustomizer.class.equals(it))//
- .map(this::createQuerydslBinderCustomizer).orElseGet(() -> repositories.flatMap(it -> it.getRepositoryFor(domainType))//
+ .map(this::createQuerydslBinderCustomizer)
+ .orElseGet(() -> repositories.flatMap(it -> it.getRepositoryFor(domainType))//
.map(it -> it instanceof QuerydslBinderCustomizer ? (QuerydslBinderCustomizer>) it : null)//
.orElse(NoOpCustomizer.INSTANCE));
}
diff --git a/src/main/java/org/springframework/data/web/querydsl/QuerydslPredicateArgumentResolver.java b/src/main/java/org/springframework/data/web/querydsl/QuerydslPredicateArgumentResolver.java
index eaca513fb..3253fa6a1 100644
--- a/src/main/java/org/springframework/data/web/querydsl/QuerydslPredicateArgumentResolver.java
+++ b/src/main/java/org/springframework/data/web/querydsl/QuerydslPredicateArgumentResolver.java
@@ -23,10 +23,10 @@ import org.springframework.core.MethodParameter;
import org.springframework.core.convert.ConversionService;
import org.springframework.core.convert.support.DefaultConversionService;
import org.springframework.data.querydsl.binding.QuerydslBinderCustomizer;
-import org.springframework.data.querydsl.binding.QuerydslBindings;
import org.springframework.data.querydsl.binding.QuerydslBindingsFactory;
import org.springframework.data.querydsl.binding.QuerydslPredicate;
import org.springframework.data.querydsl.binding.QuerydslPredicateBuilder;
+import org.springframework.data.util.CastUtils;
import org.springframework.data.util.ClassTypeInformation;
import org.springframework.data.util.TypeInformation;
import org.springframework.util.LinkedMultiValueMap;
@@ -89,7 +89,6 @@ public class QuerydslPredicateArgumentResolver implements HandlerMethodArgumentR
* @see org.springframework.web.method.support.HandlerMethodArgumentResolver#resolveArgument(org.springframework.core.MethodParameter, org.springframework.web.method.support.ModelAndViewContainer, org.springframework.web.context.request.NativeWebRequest, org.springframework.web.bind.support.WebDataBinderFactory)
*/
@Override
- @SuppressWarnings({ "unchecked", "rawtypes" })
public Predicate resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer,
NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {
@@ -103,13 +102,13 @@ public class QuerydslPredicateArgumentResolver implements HandlerMethodArgumentR
.ofNullable(parameter.getParameterAnnotation(QuerydslPredicate.class));
TypeInformation> domainType = extractTypeInfo(parameter).getActualType();
- Optional extends Class extends QuerydslBinderCustomizer>> map = annotation
- .>map(QuerydslPredicate::bindings);
+ Optional>> bindings = annotation//
+ .map(QuerydslPredicate::bindings)//
+ .map(CastUtils::cast);
- QuerydslBindings bindings = bindingsFactory.createBindingsFor(domainType,
- (Optional>>) map);
-
- return predicateBuilder.getPredicate(domainType, parameters, bindings);
+ return predicateBuilder.getPredicate(domainType, parameters,
+ bindings.map(it -> bindingsFactory.createBindingsFor(domainType, it))
+ .orElseGet(() -> bindingsFactory.createBindingsFor(domainType)));
}
/**
@@ -125,7 +124,7 @@ public class QuerydslPredicateArgumentResolver implements HandlerMethodArgumentR
.ofNullable(parameter.getParameterAnnotation(QuerydslPredicate.class));
return annotation.filter(it -> !Object.class.equals(it.root()))//
- .>map(it -> ClassTypeInformation.from(it.root()))//
+ .> map(it -> ClassTypeInformation.from(it.root()))//
.orElseGet(() -> detectDomainType(ClassTypeInformation.fromReturnTypeOf(parameter.getMethod())));
}
diff --git a/src/test/java/org/springframework/data/querydsl/binding/QuerydslBindingsFactoryUnitTests.java b/src/test/java/org/springframework/data/querydsl/binding/QuerydslBindingsFactoryUnitTests.java
index e52fab2f7..58fcf0ffe 100755
--- a/src/test/java/org/springframework/data/querydsl/binding/QuerydslBindingsFactoryUnitTests.java
+++ b/src/test/java/org/springframework/data/querydsl/binding/QuerydslBindingsFactoryUnitTests.java
@@ -65,7 +65,7 @@ public class QuerydslBindingsFactoryUnitTests {
QuerydslBindingsFactory factory = new QuerydslBindingsFactory(SimpleEntityPathResolver.INSTANCE);
ReflectionTestUtils.setField(factory, "repositories", Optional.of(repositories));
- QuerydslBindings bindings = factory.createBindingsFor(USER_TYPE, Optional.empty());
+ QuerydslBindings bindings = factory.createBindingsFor(USER_TYPE);
Optional, Object>> binding = bindings
.getBindingForPath(PropertyPathInformation.of("firstname", User.class));
@@ -85,7 +85,7 @@ public class QuerydslBindingsFactoryUnitTests {
QuerydslBindingsFactory factory = new QuerydslBindingsFactory(SimpleEntityPathResolver.INSTANCE);
ReflectionTestUtils.setField(factory, "beanFactory", Optional.of(beanFactory));
- QuerydslBindings bindings = factory.createBindingsFor(USER_TYPE, Optional.of(SpecificBinding.class));
+ QuerydslBindings bindings = factory.createBindingsFor(USER_TYPE, SpecificBinding.class);
Optional, Object>> binding = bindings
.getBindingForPath(PropertyPathInformation.of("firstname", User.class));
@@ -99,7 +99,7 @@ public class QuerydslBindingsFactoryUnitTests {
public void rejectsPredicateResolutionIfDomainTypeCantBeAutoDetected() {
assertThatExceptionOfType(IllegalStateException.class)//
- .isThrownBy(() -> factory.createBindingsFor(ClassTypeInformation.from(ModelAndView.class), Optional.empty()))//
+ .isThrownBy(() -> factory.createBindingsFor(ClassTypeInformation.from(ModelAndView.class)))//
.withMessageContaining(QuerydslPredicate.class.getSimpleName())//
.withMessageContaining("root");