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:
@@ -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,
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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());
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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());
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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(
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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()));
|
||||
}
|
||||
|
||||
|
||||
@@ -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));
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user