Skip to content

Commit 917c3e2

Browse files
committed
DATACMNS-867 - Removed Optional from QuerydslBindingsFactory API.
1 parent 9b4188b commit 917c3e2

File tree

4 files changed

+41
-18
lines changed

4 files changed

+41
-18
lines changed

src/main/java/org/springframework/data/querydsl/binding/QuerydslBindings.java

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@
2020
import lombok.Value;
2121

2222
import java.util.Arrays;
23-
import java.util.Collection;
2423
import java.util.HashSet;
2524
import java.util.LinkedHashMap;
2625
import java.util.List;
@@ -37,7 +36,6 @@
3736
import org.springframework.util.StringUtils;
3837

3938
import com.querydsl.core.types.Path;
40-
import com.querydsl.core.types.Predicate;
4139

4240
/**
4341
* {@link QuerydslBindings} allows definition of path specific bindings.
@@ -478,7 +476,8 @@ public <P extends Path<T>> void firstOptional(OptionalValueBinding<P, T> binding
478476
public <P extends Path<T>> void first(SingleValueBinding<P, T> binding) {
479477

480478
Assert.notNull(binding, "Binding must not be null!");
481-
all((MultiValueBinding<P, T>) (path, value) -> Optionals.next(value.iterator()).flatMap(t -> binding.bind(path, t)));
479+
all((MultiValueBinding<P, T>) (path, value) -> Optionals.next(value.iterator())
480+
.flatMap(t -> binding.bind(path, t)));
482481
}
483482

484483
/**
@@ -490,7 +489,7 @@ public <P extends Path<T>> void all(MultiValueBinding<P, T> binding) {
490489

491490
Assert.notNull(binding, "Binding must not be null!");
492491

493-
QuerydslBindings.this.typeSpecs.put(type, PathAndBinding.<T, P>withoutPath().with(binding));
492+
QuerydslBindings.this.typeSpecs.put(type, PathAndBinding.<T, P> withoutPath().with(binding));
494493
}
495494
}
496495

src/main/java/org/springframework/data/querydsl/binding/QuerydslBindingsFactory.java

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,30 @@ public EntityPathResolver getEntityPathResolver() {
8484
return entityPathResolver;
8585
}
8686

87+
/**
88+
* Creates the {@link QuerydslBindings} to be used using for the given domain type. A {@link QuerydslBinderCustomizer}
89+
* will be auto-detected.
90+
*
91+
* @param domainType must not be {@literal null}.
92+
* @return will never be {@literal null}.
93+
*/
94+
public QuerydslBindings createBindingsFor(TypeInformation<?> domainType) {
95+
return createBindingsFor(domainType, Optional.empty());
96+
}
97+
98+
/**
99+
* Creates the {@link QuerydslBindings} to be used using for the given domain type and a pre-defined
100+
* {@link QuerydslBinderCustomizer}.
101+
*
102+
* @param domainType must not be {@literal null}.
103+
* @param customizer the {@link QuerydslBinderCustomizer} to use, must not be {@literal null}.
104+
* @return will never be {@literal null}.
105+
*/
106+
public QuerydslBindings createBindingsFor(TypeInformation<?> domainType,
107+
Class<? extends QuerydslBinderCustomizer<?>> customizer) {
108+
return createBindingsFor(domainType, Optional.of(customizer));
109+
}
110+
87111
/**
88112
* Creates the {@link QuerydslBindings} to be used using for the given domain type and a pre-defined
89113
* {@link QuerydslBinderCustomizer}. If no customizer is given, auto-detection will be applied.
@@ -93,7 +117,7 @@ public EntityPathResolver getEntityPathResolver() {
93117
* detection for the given domain type will be applied.
94118
* @return
95119
*/
96-
public QuerydslBindings createBindingsFor(TypeInformation<?> domainType,
120+
private QuerydslBindings createBindingsFor(TypeInformation<?> domainType,
97121
Optional<Class<? extends QuerydslBinderCustomizer<?>>> customizer) {
98122

99123
Assert.notNull(customizer, "Customizer must not be null!");
@@ -141,7 +165,8 @@ private QuerydslBinderCustomizer<EntityPath<?>> findCustomizerForDomainType(
141165

142166
return customizer//
143167
.filter(it -> !QuerydslBinderCustomizer.class.equals(it))//
144-
.map(this::createQuerydslBinderCustomizer).orElseGet(() -> repositories.flatMap(it -> it.getRepositoryFor(domainType))//
168+
.map(this::createQuerydslBinderCustomizer)
169+
.orElseGet(() -> repositories.flatMap(it -> it.getRepositoryFor(domainType))//
145170
.map(it -> it instanceof QuerydslBinderCustomizer ? (QuerydslBinderCustomizer<EntityPath<?>>) it : null)//
146171
.orElse(NoOpCustomizer.INSTANCE));
147172
}

src/main/java/org/springframework/data/web/querydsl/QuerydslPredicateArgumentResolver.java

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -23,10 +23,10 @@
2323
import org.springframework.core.convert.ConversionService;
2424
import org.springframework.core.convert.support.DefaultConversionService;
2525
import org.springframework.data.querydsl.binding.QuerydslBinderCustomizer;
26-
import org.springframework.data.querydsl.binding.QuerydslBindings;
2726
import org.springframework.data.querydsl.binding.QuerydslBindingsFactory;
2827
import org.springframework.data.querydsl.binding.QuerydslPredicate;
2928
import org.springframework.data.querydsl.binding.QuerydslPredicateBuilder;
29+
import org.springframework.data.util.CastUtils;
3030
import org.springframework.data.util.ClassTypeInformation;
3131
import org.springframework.data.util.TypeInformation;
3232
import org.springframework.util.LinkedMultiValueMap;
@@ -89,7 +89,6 @@ public boolean supportsParameter(MethodParameter parameter) {
8989
* @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)
9090
*/
9191
@Override
92-
@SuppressWarnings({ "unchecked", "rawtypes" })
9392
public Predicate resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer,
9493
NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {
9594

@@ -103,13 +102,13 @@ public Predicate resolveArgument(MethodParameter parameter, ModelAndViewContaine
103102
.ofNullable(parameter.getParameterAnnotation(QuerydslPredicate.class));
104103
TypeInformation<?> domainType = extractTypeInfo(parameter).getActualType();
105104

106-
Optional<? extends Class<? extends QuerydslBinderCustomizer>> map = annotation
107-
.<Class<? extends QuerydslBinderCustomizer>>map(QuerydslPredicate::bindings);
105+
Optional<Class<? extends QuerydslBinderCustomizer<?>>> bindings = annotation//
106+
.map(QuerydslPredicate::bindings)//
107+
.map(CastUtils::cast);
108108

109-
QuerydslBindings bindings = bindingsFactory.createBindingsFor(domainType,
110-
(Optional<Class<? extends QuerydslBinderCustomizer<?>>>) map);
111-
112-
return predicateBuilder.getPredicate(domainType, parameters, bindings);
109+
return predicateBuilder.getPredicate(domainType, parameters,
110+
bindings.map(it -> bindingsFactory.createBindingsFor(domainType, it))
111+
.orElseGet(() -> bindingsFactory.createBindingsFor(domainType)));
113112
}
114113

115114
/**
@@ -125,7 +124,7 @@ static TypeInformation<?> extractTypeInfo(MethodParameter parameter) {
125124
.ofNullable(parameter.getParameterAnnotation(QuerydslPredicate.class));
126125

127126
return annotation.filter(it -> !Object.class.equals(it.root()))//
128-
.<TypeInformation<?>>map(it -> ClassTypeInformation.from(it.root()))//
127+
.<TypeInformation<?>> map(it -> ClassTypeInformation.from(it.root()))//
129128
.orElseGet(() -> detectDomainType(ClassTypeInformation.fromReturnTypeOf(parameter.getMethod())));
130129
}
131130

src/test/java/org/springframework/data/querydsl/binding/QuerydslBindingsFactoryUnitTests.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ public void createBindingsShouldHonorQuerydslBinderCustomizerHookWhenPresent() {
6565
QuerydslBindingsFactory factory = new QuerydslBindingsFactory(SimpleEntityPathResolver.INSTANCE);
6666
ReflectionTestUtils.setField(factory, "repositories", Optional.of(repositories));
6767

68-
QuerydslBindings bindings = factory.createBindingsFor(USER_TYPE, Optional.empty());
68+
QuerydslBindings bindings = factory.createBindingsFor(USER_TYPE);
6969
Optional<MultiValueBinding<Path<Object>, Object>> binding = bindings
7070
.getBindingForPath(PropertyPathInformation.of("firstname", User.class));
7171

@@ -85,7 +85,7 @@ public void shouldReuseExistingQuerydslBinderCustomizer() {
8585
QuerydslBindingsFactory factory = new QuerydslBindingsFactory(SimpleEntityPathResolver.INSTANCE);
8686
ReflectionTestUtils.setField(factory, "beanFactory", Optional.of(beanFactory));
8787

88-
QuerydslBindings bindings = factory.createBindingsFor(USER_TYPE, Optional.of(SpecificBinding.class));
88+
QuerydslBindings bindings = factory.createBindingsFor(USER_TYPE, SpecificBinding.class);
8989
Optional<MultiValueBinding<Path<Object>, Object>> binding = bindings
9090
.getBindingForPath(PropertyPathInformation.of("firstname", User.class));
9191

@@ -99,7 +99,7 @@ public void shouldReuseExistingQuerydslBinderCustomizer() {
9999
public void rejectsPredicateResolutionIfDomainTypeCantBeAutoDetected() {
100100

101101
assertThatExceptionOfType(IllegalStateException.class)//
102-
.isThrownBy(() -> factory.createBindingsFor(ClassTypeInformation.from(ModelAndView.class), Optional.empty()))//
102+
.isThrownBy(() -> factory.createBindingsFor(ClassTypeInformation.from(ModelAndView.class)))//
103103
.withMessageContaining(QuerydslPredicate.class.getSimpleName())//
104104
.withMessageContaining("root");
105105

0 commit comments

Comments
 (0)