Reintroduce explicit local variable types.

We now reinstate local variable types instead of var as general var usage removes contextual detail that cannot be omitted generally.

See #2465
This commit is contained in:
Mark Paluch
2022-03-28 08:55:29 +02:00
parent c85c4ef2ed
commit 0e5e869cbf
249 changed files with 1662 additions and 1507 deletions

View File

@@ -28,6 +28,7 @@ import org.springframework.hateoas.TemplateVariables;
import org.springframework.hateoas.server.mvc.UriComponentsContributor;
import org.springframework.lang.Nullable;
import org.springframework.util.Assert;
import org.springframework.util.MultiValueMap;
import org.springframework.web.util.UriComponents;
import org.springframework.web.util.UriComponentsBuilder;
@@ -75,24 +76,24 @@ public class HateoasPageableHandlerMethodArgumentResolver extends PageableHandle
*/
public TemplateVariables getPaginationTemplateVariables(MethodParameter parameter, UriComponents template) {
var pagePropertyName = getParameterNameToUse(getPageParameterName(), parameter);
var sizePropertyName = getParameterNameToUse(getSizeParameterName(), parameter);
String pagePropertyName = getParameterNameToUse(getPageParameterName(), parameter);
String sizePropertyName = getParameterNameToUse(getSizeParameterName(), parameter);
List<TemplateVariable> names = new ArrayList<>();
var queryParameters = template.getQueryParams();
var append = !queryParameters.isEmpty();
MultiValueMap<String, String> queryParameters = template.getQueryParams();
boolean append = !queryParameters.isEmpty();
for (var propertyName : Arrays.asList(pagePropertyName, sizePropertyName)) {
for (String propertyName : Arrays.asList(pagePropertyName, sizePropertyName)) {
if (!queryParameters.containsKey(propertyName)) {
var type = append ? REQUEST_PARAM_CONTINUED : REQUEST_PARAM;
var description = String.format("pagination.%s.description", propertyName);
TemplateVariable.VariableType type = append ? REQUEST_PARAM_CONTINUED : REQUEST_PARAM;
String description = String.format("pagination.%s.description", propertyName);
names.add(new TemplateVariable(propertyName, type, description));
}
}
var pagingVariables = new TemplateVariables(names);
TemplateVariables pagingVariables = new TemplateVariables(names);
return pagingVariables.concat(sortResolver.getSortTemplateVariables(parameter, template));
}
@@ -109,10 +110,10 @@ public class HateoasPageableHandlerMethodArgumentResolver extends PageableHandle
return;
}
var pagePropertyName = getParameterNameToUse(getPageParameterName(), parameter);
var sizePropertyName = getParameterNameToUse(getSizeParameterName(), parameter);
String pagePropertyName = getParameterNameToUse(getPageParameterName(), parameter);
String sizePropertyName = getParameterNameToUse(getSizeParameterName(), parameter);
var pageNumber = pageable.getPageNumber();
int pageNumber = pageable.getPageNumber();
builder.replaceQueryParam(pagePropertyName, isOneIndexedParameters() ? pageNumber + 1 : pageNumber);
builder.replaceQueryParam(sizePropertyName,

View File

@@ -23,6 +23,7 @@ import org.springframework.hateoas.TemplateVariable;
import org.springframework.hateoas.TemplateVariables;
import org.springframework.hateoas.server.mvc.UriComponentsContributor;
import org.springframework.lang.Nullable;
import org.springframework.util.MultiValueMap;
import org.springframework.web.util.UriComponents;
import org.springframework.web.util.UriComponentsBuilder;
@@ -47,16 +48,16 @@ public class HateoasSortHandlerMethodArgumentResolver extends SortHandlerMethodA
*/
public TemplateVariables getSortTemplateVariables(MethodParameter parameter, UriComponents template) {
var sortParameter = getSortParameter(parameter);
var queryParameters = template.getQueryParams();
var append = !queryParameters.isEmpty();
String sortParameter = getSortParameter(parameter);
MultiValueMap<String, String> queryParameters = template.getQueryParams();
boolean append = !queryParameters.isEmpty();
if (queryParameters.containsKey(sortParameter)) {
return TemplateVariables.NONE;
}
var description = String.format("pagination.%s.description", sortParameter);
var type = append ? REQUEST_PARAM_CONTINUED : REQUEST_PARAM;
String description = String.format("pagination.%s.description", sortParameter);
TemplateVariable.VariableType type = append ? REQUEST_PARAM_CONTINUED : REQUEST_PARAM;
return new TemplateVariables(new TemplateVariable(sortParameter, type, description));
}
@@ -67,11 +68,11 @@ public class HateoasSortHandlerMethodArgumentResolver extends SortHandlerMethodA
return;
}
var sortParameter = getSortParameter(parameter);
String sortParameter = getSortParameter(parameter);
builder.replaceQueryParam(sortParameter);
for (var expression : foldIntoExpressions(sort)) {
for (String expression : foldIntoExpressions(sort)) {
builder.queryParam(sortParameter, expression);
}
}

View File

@@ -35,6 +35,7 @@ import org.springframework.core.annotation.AnnotationUtils;
import org.springframework.data.projection.Accessor;
import org.springframework.data.projection.MethodInterceptorFactory;
import org.springframework.data.util.ClassTypeInformation;
import org.springframework.data.util.TypeInformation;
import org.springframework.lang.Nullable;
import org.springframework.util.Assert;
@@ -86,7 +87,7 @@ public class JsonProjectingMethodInterceptorFactory implements MethodInterceptor
Assert.notNull(jsonProvider, "JsonProvider must not be null!");
Assert.notNull(mappingProvider, "MappingProvider must not be null!");
var configuration = Configuration.builder()//
Configuration configuration = Configuration.builder()//
.options(Option.ALWAYS_RETURN_LIST) //
.jsonProvider(jsonProvider) //
.mappingProvider(mappingProvider) //
@@ -98,7 +99,7 @@ public class JsonProjectingMethodInterceptorFactory implements MethodInterceptor
@Override
public MethodInterceptor createMethodInterceptor(Object source, Class<?> targetType) {
var context = InputStream.class.isInstance(source) ? this.context.parse((InputStream) source)
DocumentContext context = InputStream.class.isInstance(source) ? this.context.parse((InputStream) source)
: this.context.parse(source);
return new InputMessageProjecting(context);
@@ -123,7 +124,7 @@ public class JsonProjectingMethodInterceptorFactory implements MethodInterceptor
*/
private static boolean hasJsonPathAnnotation(Class<?> type) {
for (var method : type.getMethods()) {
for (Method method : type.getMethods()) {
if (AnnotationUtils.findAnnotation(method, org.springframework.data.web.JsonPath.class) != null) {
return true;
}
@@ -144,32 +145,32 @@ public class JsonProjectingMethodInterceptorFactory implements MethodInterceptor
@Override
public Object invoke(MethodInvocation invocation) throws Throwable {
var method = invocation.getMethod();
var returnType = ClassTypeInformation.fromReturnTypeOf(method);
var type = ResolvableType.forMethodReturnType(method);
var isCollectionResult = Collection.class.isAssignableFrom(type.getRawClass());
Method method = invocation.getMethod();
TypeInformation<Object> returnType = ClassTypeInformation.fromReturnTypeOf(method);
ResolvableType type = ResolvableType.forMethodReturnType(method);
boolean isCollectionResult = Collection.class.isAssignableFrom(type.getRawClass());
type = isCollectionResult ? type : ResolvableType.forClassWithGenerics(List.class, type);
Iterable<String> jsonPaths = getJsonPaths(method);
for (var jsonPath : jsonPaths) {
for (String jsonPath : jsonPaths) {
try {
if (returnType.getRequiredActualType().getType().isInterface()) {
List<?> result = context.read(jsonPath);
var nested = result.isEmpty() ? null : result.get(0);
Object nested = result.isEmpty() ? null : result.get(0);
return isCollectionResult && !(nested instanceof Collection) ? result : nested;
}
var definitePath = JsonPath.isPathDefinite(jsonPath);
boolean definitePath = JsonPath.isPathDefinite(jsonPath);
type = isCollectionResult && definitePath
? ResolvableType.forClassWithGenerics(List.class, type)
: type;
var result = (List<?>) context.read(jsonPath, new ResolvableTypeRef(type));
List<?> result = (List<?>) context.read(jsonPath, new ResolvableTypeRef(type));
if (isCollectionResult && definitePath) {
result = (List<?>) result.get(0);
@@ -193,7 +194,7 @@ public class JsonProjectingMethodInterceptorFactory implements MethodInterceptor
*/
private static Collection<String> getJsonPaths(Method method) {
var annotation = AnnotationUtils.findAnnotation(method,
org.springframework.data.web.JsonPath annotation = AnnotationUtils.findAnnotation(method,
org.springframework.data.web.JsonPath.class);
if (annotation != null) {

View File

@@ -15,6 +15,7 @@
*/
package org.springframework.data.web;
import java.beans.PropertyDescriptor;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@@ -32,8 +33,10 @@ import org.springframework.core.convert.ConversionService;
import org.springframework.core.convert.TypeDescriptor;
import org.springframework.data.mapping.PropertyPath;
import org.springframework.data.mapping.PropertyReferenceException;
import org.springframework.data.util.TypeInformation;
import org.springframework.expression.AccessException;
import org.springframework.expression.EvaluationContext;
import org.springframework.expression.Expression;
import org.springframework.expression.TypedValue;
import org.springframework.expression.spel.SpelEvaluationException;
import org.springframework.expression.spel.SpelParserConfiguration;
@@ -74,7 +77,7 @@ class MapDataBinder extends WebDataBinder {
@SuppressWarnings("unchecked")
public Map<String, Object> getTarget() {
var target = super.getTarget();
Object target = super.getTarget();
if (target == null) {
throw new IllegalStateException("Target bean should never be null!");
@@ -145,15 +148,15 @@ class MapDataBinder extends WebDataBinder {
throw new NotWritablePropertyException(type, propertyName);
}
var leafProperty = getPropertyPath(propertyName).getLeafProperty();
var owningType = leafProperty.getOwningType();
var propertyType = leafProperty.getTypeInformation();
PropertyPath leafProperty = getPropertyPath(propertyName).getLeafProperty();
TypeInformation<?> owningType = leafProperty.getOwningType();
TypeInformation<?> propertyType = leafProperty.getTypeInformation();
propertyType = propertyName.endsWith("]") ? propertyType.getActualType() : propertyType;
if (propertyType != null && conversionRequired(value, propertyType.getType())) {
var descriptor = BeanUtils.getPropertyDescriptor(owningType.getType(),
PropertyDescriptor descriptor = BeanUtils.getPropertyDescriptor(owningType.getType(),
leafProperty.getSegment());
if (descriptor == null) {
@@ -161,8 +164,8 @@ class MapDataBinder extends WebDataBinder {
leafProperty.getSegment(), owningType.getType()));
}
var methodParameter = new MethodParameter(descriptor.getReadMethod(), -1);
var typeDescriptor = TypeDescriptor.nested(methodParameter, 0);
MethodParameter methodParameter = new MethodParameter(descriptor.getReadMethod(), -1);
TypeDescriptor typeDescriptor = TypeDescriptor.nested(methodParameter, 0);
if (typeDescriptor == null) {
throw new IllegalStateException(
@@ -178,7 +181,7 @@ class MapDataBinder extends WebDataBinder {
.withRootObject(map) //
.build();
var expression = PARSER.parseExpression(propertyName);
Expression expression = PARSER.parseExpression(propertyName);
try {
expression.setValue(context, value);
@@ -198,7 +201,7 @@ class MapDataBinder extends WebDataBinder {
private PropertyPath getPropertyPath(String propertyName) {
var plainPropertyPath = propertyName.replaceAll("\\[.*?\\]", "");
String plainPropertyPath = propertyName.replaceAll("\\[.*?\\]", "");
return PropertyPath.from(plainPropertyPath, type);
}
@@ -242,13 +245,13 @@ class MapDataBinder extends WebDataBinder {
return TypedValue.NULL;
}
var path = PropertyPath.from(name, type);
PropertyPath path = PropertyPath.from(name, type);
try {
return super.read(context, target, name);
} catch (AccessException o_O) {
var emptyResult = path.isCollection() ? CollectionFactory.createCollection(List.class, 0)
Object emptyResult = path.isCollection() ? CollectionFactory.createCollection(List.class, 0)
: CollectionFactory.createMap(Map.class, 0);
((Map<String, Object>) target).put(name, emptyResult);
@@ -268,9 +271,9 @@ class MapDataBinder extends WebDataBinder {
*/
private TypeDescriptor getDescriptor(PropertyPath path, Object emptyValue) {
var actualPropertyType = path.getType();
Class<?> actualPropertyType = path.getType();
var valueDescriptor = conversionService.canConvert(String.class, actualPropertyType)
TypeDescriptor valueDescriptor = conversionService.canConvert(String.class, actualPropertyType)
? TypeDescriptor.valueOf(String.class)
: TypeDescriptor.valueOf(HashMap.class);

View File

@@ -18,6 +18,7 @@ package org.springframework.data.web;
import org.springframework.core.MethodParameter;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.lang.Nullable;
import org.springframework.web.bind.support.WebDataBinderFactory;
import org.springframework.web.context.request.NativeWebRequest;
@@ -75,11 +76,11 @@ public class PageableHandlerMethodArgumentResolver extends PageableHandlerMethod
public Pageable resolveArgument(MethodParameter methodParameter, @Nullable ModelAndViewContainer mavContainer,
NativeWebRequest webRequest, @Nullable WebDataBinderFactory binderFactory) {
var page = webRequest.getParameter(getParameterNameToUse(getPageParameterName(), methodParameter));
var pageSize = webRequest.getParameter(getParameterNameToUse(getSizeParameterName(), methodParameter));
String page = webRequest.getParameter(getParameterNameToUse(getPageParameterName(), methodParameter));
String pageSize = webRequest.getParameter(getParameterNameToUse(getSizeParameterName(), methodParameter));
var sort = sortResolver.resolveArgument(methodParameter, mavContainer, webRequest, binderFactory);
var pageable = getPageable(methodParameter, page, pageSize);
Sort sort = sortResolver.resolveArgument(methodParameter, mavContainer, webRequest, binderFactory);
Pageable pageable = getPageable(methodParameter, page, pageSize);
if (sort.isSorted()) {
return PageRequest.of(pageable.getPageNumber(), pageable.getPageSize(), sort);

View File

@@ -17,6 +17,7 @@ package org.springframework.data.web;
import static org.springframework.data.web.SpringDataAnnotationUtils.*;
import java.lang.reflect.Method;
import java.util.Optional;
import org.springframework.beans.factory.annotation.Qualifier;
@@ -191,10 +192,10 @@ public abstract class PageableHandlerMethodArgumentResolverSupport {
@Nullable String pageSizeString) {
assertPageableUniqueness(methodParameter);
var defaultOrFallback = getDefaultFromAnnotationOrFallback(methodParameter).toOptional();
Optional<Pageable> defaultOrFallback = getDefaultFromAnnotationOrFallback(methodParameter).toOptional();
var page = parseAndApplyBoundaries(pageString, Integer.MAX_VALUE, true);
var pageSize = parseAndApplyBoundaries(pageSizeString, maxPageSize, false);
Optional<Integer> page = parseAndApplyBoundaries(pageString, Integer.MAX_VALUE, true);
Optional<Integer> pageSize = parseAndApplyBoundaries(pageSizeString, maxPageSize, false);
if (!(page.isPresent() && pageSize.isPresent()) && !defaultOrFallback.isPresent()) {
return Pageable.unpaged();
@@ -223,9 +224,9 @@ public abstract class PageableHandlerMethodArgumentResolverSupport {
*/
protected String getParameterNameToUse(String source, @Nullable MethodParameter parameter) {
var builder = new StringBuilder(prefix);
StringBuilder builder = new StringBuilder(prefix);
var value = SpringDataAnnotationUtils.getQualifier(parameter);
String value = SpringDataAnnotationUtils.getQualifier(parameter);
if (StringUtils.hasLength(value)) {
builder.append(value);
@@ -237,7 +238,7 @@ public abstract class PageableHandlerMethodArgumentResolverSupport {
private Pageable getDefaultFromAnnotationOrFallback(MethodParameter methodParameter) {
var defaults = methodParameter.getParameterAnnotation(PageableDefault.class);
PageableDefault defaults = methodParameter.getParameterAnnotation(PageableDefault.class);
if (defaults != null) {
return getDefaultPageRequestFrom(methodParameter, defaults);
@@ -252,7 +253,7 @@ public abstract class PageableHandlerMethodArgumentResolverSupport {
Integer defaultPageSize = getSpecificPropertyOrDefaultFromValue(defaults, "size");
if (defaultPageSize < 1) {
var annotatedMethod = parameter.getMethod();
Method annotatedMethod = parameter.getMethod();
throw new IllegalStateException(String.format(INVALID_DEFAULT_PAGE_SIZE, annotatedMethod));
}
@@ -279,7 +280,7 @@ public abstract class PageableHandlerMethodArgumentResolverSupport {
}
try {
var parsed = Integer.parseInt(parameter) - (oneIndexedParameters && shiftIndex ? 1 : 0);
int parsed = Integer.parseInt(parameter) - (oneIndexedParameters && shiftIndex ? 1 : 0);
return Optional.of(parsed < 0 ? 0 : parsed > upper ? upper : parsed);
} catch (NumberFormatException e) {
return Optional.of(0);

View File

@@ -41,6 +41,7 @@ import org.springframework.lang.Nullable;
import org.springframework.util.Assert;
import org.springframework.web.servlet.support.ServletUriComponentsBuilder;
import org.springframework.web.util.UriComponents;
import org.springframework.web.util.UriComponentsBuilder;
/**
* {@link RepresentationModelAssembler} to easily convert {@link Page} instances into {@link PagedModel}.
@@ -167,10 +168,10 @@ public class PagedResourcesAssembler<T> implements RepresentationModelAssembler<
Assert.notNull(type, "Type must not be null!");
Assert.notNull(link, "Link must not be null!");
var metadata = asPageMetadata(page);
PageMetadata metadata = asPageMetadata(page);
var wrapper = wrappers.emptyCollectionOf(type);
var embedded = Collections.singletonList(wrapper);
EmbeddedWrapper wrapper = wrappers.emptyCollectionOf(type);
List<EmbeddedWrapper> embedded = Collections.singletonList(wrapper);
return addPaginationLinks(PagedModel.of(embedded, metadata), page, link);
}
@@ -201,20 +202,20 @@ public class PagedResourcesAssembler<T> implements RepresentationModelAssembler<
List<R> resources = new ArrayList<>(page.getNumberOfElements());
for (var element : page) {
for (S element : page) {
resources.add(assembler.toModel(element));
}
var resource = createPagedModel(resources, asPageMetadata(page), page);
PagedModel<R> resource = createPagedModel(resources, asPageMetadata(page), page);
return addPaginationLinks(resource, page, link);
}
private <R> PagedModel<R> addPaginationLinks(PagedModel<R> resources, Page<?> page, Optional<Link> link) {
var base = getUriTemplate(link);
UriTemplate base = getUriTemplate(link);
var isNavigable = page.hasPrevious() || page.hasNext();
boolean isNavigable = page.hasPrevious() || page.hasNext();
if (isNavigable || forceFirstAndLastRels) {
resources.add(createLink(base, PageRequest.of(0, page.getSize(), page.getSort()), IanaLinkRelations.FIRST));
@@ -224,7 +225,7 @@ public class PagedResourcesAssembler<T> implements RepresentationModelAssembler<
resources.add(createLink(base, page.previousPageable(), IanaLinkRelations.PREV));
}
var selfLink = link.map(Link::withSelfRel)//
Link selfLink = link.map(Link::withSelfRel)//
.orElseGet(() -> createLink(base, page.getPageable(), IanaLinkRelations.SELF));
resources.add(selfLink);
@@ -235,7 +236,7 @@ public class PagedResourcesAssembler<T> implements RepresentationModelAssembler<
if (isNavigable || forceFirstAndLastRels) {
var lastIndex = page.getTotalPages() == 0 ? 0 : page.getTotalPages() - 1;
int lastIndex = page.getTotalPages() == 0 ? 0 : page.getTotalPages() - 1;
resources
.add(createLink(base, PageRequest.of(lastIndex, page.getSize(), page.getSort()), IanaLinkRelations.LAST));
@@ -265,7 +266,7 @@ public class PagedResourcesAssembler<T> implements RepresentationModelAssembler<
*/
private Link createLink(UriTemplate base, Pageable pageable, LinkRelation relation) {
var builder = fromUri(base.expand());
UriComponentsBuilder builder = fromUri(base.expand());
pageableResolver.enhance(builder, getMethodParameter(), pageable);
return Link.of(UriTemplate.of(builder.build().toString()), relation);
@@ -293,7 +294,7 @@ public class PagedResourcesAssembler<T> implements RepresentationModelAssembler<
Assert.notNull(page, "Page must not be null!");
var number = pageableResolver.isOneIndexedParameters() ? page.getNumber() + 1 : page.getNumber();
int number = pageableResolver.isOneIndexedParameters() ? page.getNumber() + 1 : page.getNumber();
return new PageMetadata(page.getSize(), number, page.getTotalElements(), page.getTotalPages());
}

View File

@@ -15,6 +15,9 @@
*/
package org.springframework.data.web;
import java.lang.reflect.Method;
import java.util.List;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
@@ -68,7 +71,7 @@ public class PagedResourcesAssemblerArgumentResolver implements HandlerMethodArg
public Object resolveArgument(MethodParameter parameter, @Nullable ModelAndViewContainer mavContainer,
NativeWebRequest webRequest, @Nullable WebDataBinderFactory binderFactory) {
var pageableParameter = findMatchingPageableParameter(parameter);
MethodParameter pageableParameter = findMatchingPageableParameter(parameter);
if (pageableParameter != null) {
return new MethodParameterAwarePagedResourcesAssembler<>(pageableParameter, resolver, null);
@@ -87,15 +90,15 @@ public class PagedResourcesAssemblerArgumentResolver implements HandlerMethodArg
@Nullable
private static MethodParameter findMatchingPageableParameter(MethodParameter parameter) {
var method = parameter.getMethod();
Method method = parameter.getMethod();
if (method == null) {
throw new IllegalArgumentException(String.format("Could not obtain method from parameter %s!", parameter));
}
var parameters = MethodParameters.of(method);
var pageableParameters = parameters.getParametersOfType(Pageable.class);
var assemblerQualifier = parameter.getParameterAnnotation(Qualifier.class);
MethodParameters parameters = MethodParameters.of(method);
List<MethodParameter> pageableParameters = parameters.getParametersOfType(Pageable.class);
Qualifier assemblerQualifier = parameter.getParameterAnnotation(Qualifier.class);
if (pageableParameters.isEmpty()) {
return null;
@@ -103,8 +106,8 @@ public class PagedResourcesAssemblerArgumentResolver implements HandlerMethodArg
if (pageableParameters.size() == 1) {
var pageableParameter = pageableParameters.get(0);
var matchingParameter = returnIfQualifiersMatch(pageableParameter, assemblerQualifier);
MethodParameter pageableParameter = pageableParameters.get(0);
MethodParameter matchingParameter = returnIfQualifiersMatch(pageableParameter, assemblerQualifier);
if (matchingParameter == null) {
logger.info(LogMessage.format(SUPERFLOUS_QUALIFIER, PagedResourcesAssembler.class.getSimpleName(),
@@ -118,9 +121,9 @@ public class PagedResourcesAssemblerArgumentResolver implements HandlerMethodArg
throw new IllegalStateException(PARAMETER_AMBIGUITY);
}
for (var pageableParameter : pageableParameters) {
for (MethodParameter pageableParameter : pageableParameters) {
var matchingParameter = returnIfQualifiersMatch(pageableParameter, assemblerQualifier);
MethodParameter matchingParameter = returnIfQualifiersMatch(pageableParameter, assemblerQualifier);
if (matchingParameter != null) {
return matchingParameter;
@@ -138,7 +141,7 @@ public class PagedResourcesAssemblerArgumentResolver implements HandlerMethodArg
return pageableParameter;
}
var pageableParameterQualifier = pageableParameter.getParameterAnnotation(Qualifier.class);
Qualifier pageableParameterQualifier = pageableParameter.getParameterAnnotation(Qualifier.class);
if (pageableParameterQualifier == null) {
return null;

View File

@@ -84,7 +84,7 @@ public class ProjectingJackson2HttpMessageConverter extends MappingJackson2HttpM
Assert.notNull(mapper, "ObjectMapper must not be null!");
var projectionFactory = new SpelAwareProxyProjectionFactory();
SpelAwareProxyProjectionFactory projectionFactory = new SpelAwareProxyProjectionFactory();
projectionFactory.registerMethodInvokerFactory(new JsonProjectingMethodInterceptorFactory(
new JacksonJsonProvider(mapper), new JacksonMappingProvider(mapper)));
@@ -108,9 +108,9 @@ public class ProjectingJackson2HttpMessageConverter extends MappingJackson2HttpM
return false;
}
var owner = contextClass == null ? null : ResolvableType.forClass(contextClass);
var rawType = ResolvableType.forType(type, owner).resolve(Object.class);
var result = supportedTypesCache.get(rawType);
ResolvableType owner = contextClass == null ? null : ResolvableType.forClass(contextClass);
Class<?> rawType = ResolvableType.forType(type, owner).resolve(Object.class);
Boolean result = supportedTypesCache.get(rawType);
if (result != null) {
return result;

View File

@@ -80,7 +80,7 @@ public class ProxyingHandlerMethodArgumentResolver extends ModelAttributeMethodP
return false;
}
var type = parameter.getParameterType();
Class<?> type = parameter.getParameterType();
if (!type.isInterface()) {
return false;
@@ -97,7 +97,7 @@ public class ProxyingHandlerMethodArgumentResolver extends ModelAttributeMethodP
}
// Fallback for only user defined interfaces
var packageName = ClassUtils.getPackageName(type);
String packageName = ClassUtils.getPackageName(type);
return !IGNORED_PACKAGES.stream().anyMatch(it -> packageName.startsWith(it));
}
@@ -106,7 +106,7 @@ public class ProxyingHandlerMethodArgumentResolver extends ModelAttributeMethodP
protected Object createAttribute(String attributeName, MethodParameter parameter, WebDataBinderFactory binderFactory,
NativeWebRequest request) throws Exception {
var binder = new MapDataBinder(parameter.getParameterType(), conversionService.getObject());
MapDataBinder binder = new MapDataBinder(parameter.getParameterType(), conversionService.getObject());
binder.bind(new MutablePropertyValues(request.getParameterMap()));
return proxyFactory.createProjection(parameter.getParameterType(), binder.getTarget());

View File

@@ -18,8 +18,10 @@ package org.springframework.data.web;
import org.springframework.core.MethodParameter;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.lang.NonNull;
import org.springframework.util.Assert;
import org.springframework.util.MultiValueMap;
import org.springframework.web.reactive.BindingContext;
import org.springframework.web.reactive.result.method.SyncHandlerMethodArgumentResolver;
import org.springframework.web.server.ServerWebExchange;
@@ -68,13 +70,13 @@ public class ReactivePageableHandlerMethodArgumentResolver extends PageableHandl
public Pageable resolveArgumentValue(MethodParameter parameter, BindingContext bindingContext,
ServerWebExchange exchange) {
var queryParams = exchange.getRequest().getQueryParams();
var page = queryParams.getFirst(getParameterNameToUse(getPageParameterName(), parameter));
var pageSize = queryParams.getFirst(getParameterNameToUse(getSizeParameterName(), parameter));
MultiValueMap<String, String> queryParams = exchange.getRequest().getQueryParams();
String page = queryParams.getFirst(getParameterNameToUse(getPageParameterName(), parameter));
String pageSize = queryParams.getFirst(getParameterNameToUse(getSizeParameterName(), parameter));
var sort = sortResolver.resolveArgumentValue(parameter, bindingContext, exchange);
Sort sort = sortResolver.resolveArgumentValue(parameter, bindingContext, exchange);
var pageable = getPageable(parameter, page, pageSize);
Pageable pageable = getPageable(parameter, page, pageSize);
return sort.isSorted() ? PageRequest.of(pageable.getPageNumber(), pageable.getPageSize(), sort) : pageable;
}

View File

@@ -15,6 +15,8 @@
*/
package org.springframework.data.web;
import java.util.List;
import org.springframework.core.MethodParameter;
import org.springframework.data.domain.Sort;
import org.springframework.lang.NonNull;
@@ -48,7 +50,7 @@ public class ReactiveSortHandlerMethodArgumentResolver extends SortHandlerMethod
public Sort resolveArgumentValue(MethodParameter parameter, BindingContext bindingContext,
ServerWebExchange exchange) {
var directionParameter = exchange.getRequest().getQueryParams().get(getSortParameter(parameter));
List<String> directionParameter = exchange.getRequest().getQueryParams().get(getSortParameter(parameter));
// No parameter
if (directionParameter == null) {

View File

@@ -49,7 +49,7 @@ public class SortHandlerMethodArgumentResolver extends SortHandlerMethodArgument
public Sort resolveArgument(MethodParameter parameter, @Nullable ModelAndViewContainer mavContainer,
NativeWebRequest webRequest, @Nullable WebDataBinderFactory binderFactory) {
var directionParameter = webRequest.getParameterValues(getSortParameter(parameter));
String[] directionParameter = webRequest.getParameterValues(getSortParameter(parameter));
// No parameter
if (directionParameter == null) {

View File

@@ -120,8 +120,8 @@ public abstract class SortHandlerMethodArgumentResolverSupport {
*/
protected Sort getDefaultFromAnnotationOrFallback(MethodParameter parameter) {
var annotatedDefaults = parameter.getParameterAnnotation(SortDefaults.class);
var annotatedDefault = parameter.getParameterAnnotation(SortDefault.class);
SortDefaults annotatedDefaults = parameter.getParameterAnnotation(SortDefaults.class);
SortDefault annotatedDefault = parameter.getParameterAnnotation(SortDefault.class);
if (annotatedDefault != null && annotatedDefaults != null) {
throw new IllegalArgumentException(
@@ -135,9 +135,9 @@ public abstract class SortHandlerMethodArgumentResolverSupport {
if (annotatedDefaults != null) {
var sort = Sort.unsorted();
Sort sort = Sort.unsorted();
for (var currentAnnotatedDefault : annotatedDefaults.value()) {
for (SortDefault currentAnnotatedDefault : annotatedDefaults.value()) {
sort = appendOrCreateSortTo(currentAnnotatedDefault, sort);
}
@@ -164,9 +164,9 @@ public abstract class SortHandlerMethodArgumentResolverSupport {
}
List<Order> orders = new ArrayList<>(fields.length);
for (var field : fields) {
for (String field : fields) {
var order = new Order(sortDefault.direction(), field);
Order order = new Order(sortDefault.direction(), field);
orders.add(sortDefault.caseSensitive() ? order : order.ignoreCase());
}
@@ -181,9 +181,9 @@ public abstract class SortHandlerMethodArgumentResolverSupport {
*/
protected String getSortParameter(@Nullable MethodParameter parameter) {
var builder = new StringBuilder();
StringBuilder builder = new StringBuilder();
var value = SpringDataAnnotationUtils.getQualifier(parameter);
String value = SpringDataAnnotationUtils.getQualifier(parameter);
if (StringUtils.hasLength(value)) {
builder.append(value);
@@ -208,7 +208,7 @@ public abstract class SortHandlerMethodArgumentResolverSupport {
List<Order> allOrders = new ArrayList<>();
for (var part : source) {
for (String part : source) {
if (part == null) {
continue;
@@ -235,9 +235,9 @@ public abstract class SortHandlerMethodArgumentResolverSupport {
List<String> expressions = new ArrayList<>();
ExpressionBuilder builder = null;
for (var order : sort) {
for (Order order : sort) {
var direction = order.getDirection();
Direction direction = order.getDirection();
if (builder == null) {
builder = new ExpressionBuilder(direction);
@@ -265,9 +265,9 @@ public abstract class SortHandlerMethodArgumentResolverSupport {
List<String> expressions = new ArrayList<>();
ExpressionBuilder builder = null;
for (var order : sort) {
for (Order order : sort) {
var direction = order.getDirection();
Direction direction = order.getDirection();
if (builder == null) {
builder = new ExpressionBuilder(direction);
@@ -388,7 +388,7 @@ public abstract class SortHandlerMethodArgumentResolverSupport {
*/
public static SortOrderParser parse(String part, String delimiter) {
var elements = Arrays.stream(part.split(delimiter)) //
String[] elements = Arrays.stream(part.split(delimiter)) //
.filter(SortHandlerMethodArgumentResolver::notOnlyDots) //
.toArray(String[]::new);
@@ -427,7 +427,7 @@ public abstract class SortHandlerMethodArgumentResolverSupport {
*/
public void forEachOrder(Consumer<? super Order> callback) {
for (var i = 0; i < lastIndex; i++) {
for (int i = 0; i < lastIndex; i++) {
toOrder(elements[i]).ifPresent(callback);
}
}
@@ -442,7 +442,7 @@ public abstract class SortHandlerMethodArgumentResolverSupport {
return Optional.empty();
}
var order = direction.map(it -> new Order(it, property)).orElseGet(() -> Order.by(property));
Order order = direction.map(it -> new Order(it, property)).orElseGet(() -> Order.by(property));
if (ignoreCase.isPresent()) {
return Optional.of(order.ignoreCase());

View File

@@ -23,6 +23,7 @@ import java.util.Set;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.core.MethodParameter;
import org.springframework.core.annotation.AnnotationUtils;
import org.springframework.core.annotation.MergedAnnotation;
import org.springframework.core.annotation.MergedAnnotations;
import org.springframework.data.domain.Pageable;
import org.springframework.lang.Nullable;
@@ -46,14 +47,14 @@ abstract class SpringDataAnnotationUtils {
*/
public static void assertPageableUniqueness(MethodParameter parameter) {
var method = parameter.getMethod();
Method method = parameter.getMethod();
if (method == null) {
throw new IllegalArgumentException(String.format("Method parameter %s is not backed by a method.", parameter));
}
if (containsMoreThanOnePageableParameter(method)) {
var annotations = method.getParameterAnnotations();
Annotation[][] annotations = method.getParameterAnnotations();
assertQualifiersFor(method.getParameterTypes(), annotations);
}
}
@@ -66,9 +67,9 @@ abstract class SpringDataAnnotationUtils {
*/
private static boolean containsMoreThanOnePageableParameter(Method method) {
var pageableFound = false;
boolean pageableFound = false;
for (var type : method.getParameterTypes()) {
for (Class<?> type : method.getParameterTypes()) {
if (pageableFound && type.equals(Pageable.class)) {
return true;
@@ -93,10 +94,10 @@ abstract class SpringDataAnnotationUtils {
@SuppressWarnings("unchecked")
public static <T> T getSpecificPropertyOrDefaultFromValue(Annotation annotation, String property) {
var propertyDefaultValue = AnnotationUtils.getDefaultValue(annotation, property);
var propertyValue = AnnotationUtils.getValue(annotation, property);
Object propertyDefaultValue = AnnotationUtils.getDefaultValue(annotation, property);
Object propertyValue = AnnotationUtils.getValue(annotation, property);
var result = ObjectUtils.nullSafeEquals(propertyDefaultValue, propertyValue) //
Object result = ObjectUtils.nullSafeEquals(propertyDefaultValue, propertyValue) //
? AnnotationUtils.getValue(annotation) //
: propertyValue;
@@ -121,8 +122,8 @@ abstract class SpringDataAnnotationUtils {
return null;
}
var annotations = MergedAnnotations.from(parameter.getParameter());
var qualifier = annotations.get(Qualifier.class);
MergedAnnotations annotations = MergedAnnotations.from(parameter.getParameter());
MergedAnnotation<Qualifier> qualifier = annotations.get(Qualifier.class);
return qualifier.isPresent() ? qualifier.getString("value") : null;
}
@@ -138,11 +139,11 @@ abstract class SpringDataAnnotationUtils {
Set<String> values = new HashSet<>();
for (var i = 0; i < annotations.length; i++) {
for (int i = 0; i < annotations.length; i++) {
if (Pageable.class.equals(parameterTypes[i])) {
var qualifier = findAnnotation(annotations[i]);
Qualifier qualifier = findAnnotation(annotations[i]);
if (null == qualifier) {
throw new IllegalStateException(
@@ -168,7 +169,7 @@ abstract class SpringDataAnnotationUtils {
@Nullable
private static Qualifier findAnnotation(Annotation[] annotations) {
for (var annotation : annotations) {
for (Annotation annotation : annotations) {
if (annotation instanceof Qualifier) {
return (Qualifier) annotation;
}

View File

@@ -62,7 +62,7 @@ public class XmlBeamHttpMessageConverter extends AbstractHttpMessageConverter<Ob
@Override
public DocumentBuilderFactory createDocumentBuilderFactory() {
var factory = super.createDocumentBuilderFactory();
DocumentBuilderFactory factory = super.createDocumentBuilderFactory();
factory.setAttribute("http://apache.org/xml/features/disallow-doctype-decl", true);
factory.setAttribute("http://xml.org/sax/features/external-general-entities", false);
@@ -89,8 +89,8 @@ public class XmlBeamHttpMessageConverter extends AbstractHttpMessageConverter<Ob
@Override
protected boolean supports(Class<?> type) {
var rawType = ResolvableType.forType(type).resolve(Object.class);
var result = supportedTypesCache.get(rawType);
Class<?> rawType = ResolvableType.forType(type).resolve(Object.class);
Boolean result = supportedTypesCache.get(rawType);
if (result != null) {
return result;
@@ -118,7 +118,7 @@ public class XmlBeamHttpMessageConverter extends AbstractHttpMessageConverter<Ob
} catch (RuntimeException o_O) {
var cause = o_O.getCause();
Throwable cause = o_O.getCause();
if (SAXParseException.class.isInstance(cause)) {
throw new HttpMessageNotReadableException("Cannot read input message!", cause, inputMessage);

View File

@@ -69,7 +69,7 @@ public class HateoasAwareSpringDataWebConfiguration extends SpringDataWebConfigu
@Bean
public HateoasPageableHandlerMethodArgumentResolver pageableResolver() {
var pageableResolver = new HateoasPageableHandlerMethodArgumentResolver(
HateoasPageableHandlerMethodArgumentResolver pageableResolver = new HateoasPageableHandlerMethodArgumentResolver(
this.sortResolver.get());
customizePageableResolver(pageableResolver);
return pageableResolver;
@@ -79,7 +79,7 @@ public class HateoasAwareSpringDataWebConfiguration extends SpringDataWebConfigu
@Override
public HateoasSortHandlerMethodArgumentResolver sortResolver() {
var sortResolver = new HateoasSortHandlerMethodArgumentResolver();
HateoasSortHandlerMethodArgumentResolver sortResolver = new HateoasSortHandlerMethodArgumentResolver();
customizeSortResolver(sortResolver);
return sortResolver;
}

View File

@@ -106,8 +106,8 @@ public class ProjectingArgumentResolverRegistrar {
return bean;
}
var adapter = (RequestMappingHandlerAdapter) bean;
var currentResolvers = adapter.getArgumentResolvers();
RequestMappingHandlerAdapter adapter = (RequestMappingHandlerAdapter) bean;
List<HandlerMethodArgumentResolver> currentResolvers = adapter.getArgumentResolvers();
if (currentResolvers == null) {
throw new IllegalStateException(

View File

@@ -93,7 +93,7 @@ public class SpringDataWebConfiguration implements WebMvcConfigurer, BeanClassLo
@Bean
public PageableHandlerMethodArgumentResolver pageableResolver() {
var pageableResolver = //
PageableHandlerMethodArgumentResolver pageableResolver = //
new PageableHandlerMethodArgumentResolver(sortResolver.get());
customizePageableResolver(pageableResolver);
return pageableResolver;
@@ -102,7 +102,7 @@ public class SpringDataWebConfiguration implements WebMvcConfigurer, BeanClassLo
@Bean
public SortHandlerMethodArgumentResolver sortResolver() {
var sortResolver = new SortHandlerMethodArgumentResolver();
SortHandlerMethodArgumentResolver sortResolver = new SortHandlerMethodArgumentResolver();
customizeSortResolver(sortResolver);
return sortResolver;
}
@@ -117,7 +117,8 @@ public class SpringDataWebConfiguration implements WebMvcConfigurer, BeanClassLo
return;
}
var converter = new DomainClassConverter<FormattingConversionService>(conversionService);
DomainClassConverter<FormattingConversionService> converter = new DomainClassConverter<FormattingConversionService>(
conversionService);
converter.setApplicationContext(context);
}
@@ -127,7 +128,7 @@ public class SpringDataWebConfiguration implements WebMvcConfigurer, BeanClassLo
argumentResolvers.add(sortResolver.get());
argumentResolvers.add(pageableResolver.get());
var resolver = new ProxyingHandlerMethodArgumentResolver(conversionService, true);
ProxyingHandlerMethodArgumentResolver resolver = new ProxyingHandlerMethodArgumentResolver(conversionService, true);
resolver.setBeanFactory(context);
forwardBeanClassLoader(resolver);
@@ -140,9 +141,9 @@ public class SpringDataWebConfiguration implements WebMvcConfigurer, BeanClassLo
if (ClassUtils.isPresent("com.jayway.jsonpath.DocumentContext", context.getClassLoader())
&& ClassUtils.isPresent("com.fasterxml.jackson.databind.ObjectMapper", context.getClassLoader())) {
var mapper = context.getBeanProvider(ObjectMapper.class).getIfUnique(ObjectMapper::new);
ObjectMapper mapper = context.getBeanProvider(ObjectMapper.class).getIfUnique(ObjectMapper::new);
var converter = new ProjectingJackson2HttpMessageConverter(mapper);
ProjectingJackson2HttpMessageConverter converter = new ProjectingJackson2HttpMessageConverter(mapper);
converter.setBeanFactory(context);
forwardBeanClassLoader(converter);

View File

@@ -16,6 +16,7 @@
package org.springframework.data.web.querydsl;
import java.util.Arrays;
import java.util.Map;
import java.util.Optional;
import org.springframework.core.MethodParameter;
@@ -30,6 +31,8 @@ import org.springframework.web.context.request.NativeWebRequest;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.method.support.ModelAndViewContainer;
import com.querydsl.core.types.Predicate;
/**
* {@link HandlerMethodArgumentResolver} to allow injection of {@link com.querydsl.core.types.Predicate} into Spring MVC
* controller methods.
@@ -71,18 +74,18 @@ public class QuerydslPredicateArgumentResolver extends QuerydslPredicateArgument
public Object resolveArgument(MethodParameter parameter, @Nullable ModelAndViewContainer mavContainer,
NativeWebRequest webRequest, @Nullable WebDataBinderFactory binderFactory) throws Exception {
var queryParameters = getQueryParameters(webRequest);
var result = getPredicate(parameter, queryParameters);
MultiValueMap<String, String> queryParameters = getQueryParameters(webRequest);
Predicate result = getPredicate(parameter, queryParameters);
return potentiallyConvertMethodParameterValue(parameter, result);
}
private static MultiValueMap<String, String> getQueryParameters(NativeWebRequest webRequest) {
var parameterMap = webRequest.getParameterMap();
Map<String, String[]> parameterMap = webRequest.getParameterMap();
MultiValueMap<String, String> queryParameters = new LinkedMultiValueMap<>(parameterMap.size());
for (var entry : parameterMap.entrySet()) {
for (Map.Entry<String, String[]> entry : parameterMap.entrySet()) {
queryParameters.put(entry.getKey(), Arrays.asList(entry.getValue()));
}

View File

@@ -15,6 +15,7 @@
*/
package org.springframework.data.web.querydsl;
import java.lang.reflect.Method;
import java.util.Optional;
import org.springframework.core.MethodParameter;
@@ -23,6 +24,7 @@ import org.springframework.core.annotation.MergedAnnotation;
import org.springframework.core.annotation.MergedAnnotations;
import org.springframework.core.convert.ConversionService;
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;
@@ -72,13 +74,13 @@ public abstract class QuerydslPredicateArgumentResolverSupport {
public boolean supportsParameter(MethodParameter parameter) {
var type = ResolvableType.forMethodParameter(parameter);
ResolvableType type = ResolvableType.forMethodParameter(parameter);
if (PREDICATE.isAssignableFrom(type) || OPTIONAL_OF_PREDICATE.isAssignableFrom(type)) {
return true;
}
var annotations = MergedAnnotations.from(parameter.getParameter());
MergedAnnotations annotations = MergedAnnotations.from(parameter.getParameter());
if (annotations.isPresent(QuerydslPredicate.class)) {
throw new IllegalArgumentException(String.format("Parameter at position %s must be of type Predicate but was %s.",
@@ -90,15 +92,15 @@ public abstract class QuerydslPredicateArgumentResolverSupport {
Predicate getPredicate(MethodParameter parameter, MultiValueMap<String, String> queryParameters) {
var annotations = MergedAnnotations.from(parameter.getParameter());
var predicateAnnotation = annotations.get(QuerydslPredicate.class);
MergedAnnotations annotations = MergedAnnotations.from(parameter.getParameter());
MergedAnnotation<QuerydslPredicate> predicateAnnotation = annotations.get(QuerydslPredicate.class);
var domainType = extractTypeInfo(parameter, predicateAnnotation).getRequiredActualType();
TypeInformation<?> domainType = extractTypeInfo(parameter, predicateAnnotation).getRequiredActualType();
Optional<Class<? extends QuerydslBinderCustomizer<?>>> bindingsAnnotation = predicateAnnotation.getValue("bindings") //
.map(CastUtils::cast);
var bindings = bindingsAnnotation //
QuerydslBindings bindings = bindingsAnnotation //
.map(it -> bindingsFactory.createBindingsFor(domainType, it)) //
.orElseGet(() -> bindingsFactory.createBindingsFor(domainType));
@@ -129,7 +131,7 @@ public abstract class QuerydslPredicateArgumentResolverSupport {
protected static TypeInformation<?> extractTypeInfo(MethodParameter parameter,
MergedAnnotation<QuerydslPredicate> predicateAnnotation) {
var annotation = predicateAnnotation.synthesize(MergedAnnotation::isPresent);
Optional<QuerydslPredicate> annotation = predicateAnnotation.synthesize(MergedAnnotation::isPresent);
return annotation.filter(it -> !Object.class.equals(it.root()))//
.<TypeInformation<?>> map(it -> ClassTypeInformation.from(it.root()))//
@@ -138,7 +140,7 @@ public abstract class QuerydslPredicateArgumentResolverSupport {
private static TypeInformation<?> detectDomainType(MethodParameter parameter) {
var method = parameter.getMethod();
Method method = parameter.getMethod();
if (method == null) {
throw new IllegalArgumentException("Method parameter is not backed by a method!");
@@ -153,7 +155,7 @@ public abstract class QuerydslPredicateArgumentResolverSupport {
return source;
}
var actualType = source.getActualType();
TypeInformation<?> actualType = source.getActualType();
if (actualType == null) {
throw new IllegalArgumentException(String.format("Could not determine domain type from %s!", source));

View File

@@ -15,6 +15,9 @@
*/
package org.springframework.data.web.querydsl;
import java.util.List;
import java.util.Map;
import org.springframework.core.MethodParameter;
import org.springframework.core.convert.ConversionService;
import org.springframework.data.querydsl.binding.QuerydslBindingsFactory;
@@ -26,6 +29,8 @@ import org.springframework.web.reactive.result.method.HandlerMethodArgumentResol
import org.springframework.web.reactive.result.method.SyncHandlerMethodArgumentResolver;
import org.springframework.web.server.ServerWebExchange;
import com.querydsl.core.types.Predicate;
/**
* {@link HandlerMethodArgumentResolver} to allow injection of {@link com.querydsl.core.types.Predicate} into Spring
* WebFlux controller methods.
@@ -47,8 +52,8 @@ public class ReactiveQuerydslPredicateArgumentResolver extends QuerydslPredicate
public Object resolveArgumentValue(MethodParameter parameter, BindingContext bindingContext,
ServerWebExchange exchange) {
var queryParameters = getQueryParameters(exchange);
var result = getPredicate(parameter, queryParameters);
MultiValueMap<String, String> queryParameters = getQueryParameters(exchange);
Predicate result = getPredicate(parameter, queryParameters);
return potentiallyConvertMethodParameterValue(parameter, result);
}
@@ -56,10 +61,10 @@ public class ReactiveQuerydslPredicateArgumentResolver extends QuerydslPredicate
private static MultiValueMap<String, String> getQueryParameters(ServerWebExchange exchange) {
var queryParams = exchange.getRequest().getQueryParams();
MultiValueMap<String, String> queryParams = exchange.getRequest().getQueryParams();
MultiValueMap<String, String> parameters = new LinkedMultiValueMap<>(queryParams.size());
for (var entry : queryParams.entrySet()) {
for (Map.Entry<String, List<String>> entry : queryParams.entrySet()) {
parameters.put(entry.getKey(), entry.getValue());
}