From 34adf44c1fe50e125b19a85c4d84ff3c3dc43060 Mon Sep 17 00:00:00 2001 From: Jon Brisbin Date: Tue, 12 Mar 2013 13:36:46 -0500 Subject: [PATCH] Fix a bug where property mappings weren't being considered in sort parameter names. --- ...agingAndSortingMethodArgumentResolver.java | 136 ++++++++++-------- 1 file changed, 73 insertions(+), 63 deletions(-) diff --git a/spring-data-rest-webmvc/src/main/java/org/springframework/data/rest/webmvc/PagingAndSortingMethodArgumentResolver.java b/spring-data-rest-webmvc/src/main/java/org/springframework/data/rest/webmvc/PagingAndSortingMethodArgumentResolver.java index 5c79ecbf9..f90c94bdc 100644 --- a/spring-data-rest-webmvc/src/main/java/org/springframework/data/rest/webmvc/PagingAndSortingMethodArgumentResolver.java +++ b/spring-data-rest-webmvc/src/main/java/org/springframework/data/rest/webmvc/PagingAndSortingMethodArgumentResolver.java @@ -9,7 +9,9 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.MethodParameter; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Sort; +import org.springframework.data.repository.core.RepositoryInformation; import org.springframework.data.rest.config.RepositoryRestConfiguration; +import org.springframework.data.rest.config.ResourceMapping; import org.springframework.data.rest.repository.PagingAndSorting; import org.springframework.data.web.PageableDefaults; import org.springframework.util.ClassUtils; @@ -27,76 +29,84 @@ import org.springframework.web.method.support.ModelAndViewContainer; */ public class PagingAndSortingMethodArgumentResolver implements HandlerMethodArgumentResolver { - private static final int DEFAULT_PAGE = 1; // We're 1-based, not 0-based - @Autowired - private RepositoryRestConfiguration config; + private static final int DEFAULT_PAGE = 1; // We're 1-based, not 0-based + @Autowired + private RepositoryRestConfiguration config; + @Autowired + private RepositoryInformationHandlerMethodArgumentResolver repoInfoResolver; - public PagingAndSortingMethodArgumentResolver() { - } + public PagingAndSortingMethodArgumentResolver() { + } - public PagingAndSortingMethodArgumentResolver(RepositoryRestConfiguration config) { - this.config = config; - } + public PagingAndSortingMethodArgumentResolver(RepositoryRestConfiguration config) { + this.config = config; + } - @Override public boolean supportsParameter(MethodParameter parameter) { - return ClassUtils.isAssignable(parameter.getParameterType(), PagingAndSorting.class); - } + @Override public boolean supportsParameter(MethodParameter parameter) { + return ClassUtils.isAssignable(parameter.getParameterType(), PagingAndSorting.class); + } - @Override - public Object resolveArgument(MethodParameter parameter, - ModelAndViewContainer mavContainer, - NativeWebRequest webRequest, - WebDataBinderFactory binderFactory) throws Exception { - HttpServletRequest request = (HttpServletRequest)webRequest.getNativeRequest(); + @Override + public Object resolveArgument(MethodParameter parameter, + ModelAndViewContainer mavContainer, + NativeWebRequest webRequest, + WebDataBinderFactory binderFactory) throws Exception { + RepositoryInformation repoInfo = (RepositoryInformation)repoInfoResolver.resolveArgument(parameter, + mavContainer, + webRequest, + binderFactory); + ResourceMapping repoMapping = config.getResourceMappingForDomainType(repoInfo.getDomainType()); + HttpServletRequest request = (HttpServletRequest)webRequest.getNativeRequest(); - PageRequest pr = null; - for(Annotation annotation : parameter.getParameterAnnotations()) { - if(annotation instanceof PageableDefaults) { - PageableDefaults defaults = (PageableDefaults)annotation; - pr = new PageRequest(defaults.pageNumber(), defaults.value()); - break; - } - } - if(null == pr) { - int page = DEFAULT_PAGE; - String sPage = request.getParameter(config.getPageParamName()); - if(StringUtils.hasText(sPage)) { - try { - page = Integer.parseInt(sPage); - } catch(NumberFormatException ignored) { - } - } - int limit = config.getDefaultPageSize(); - String sLimit = request.getParameter(config.getLimitParamName()); - if(StringUtils.hasText(sLimit)) { - try { - limit = Math.min(Integer.parseInt(sLimit), config.getMaxPageSize()); - } catch(NumberFormatException ignored) { - } - } + PageRequest pr = null; + for(Annotation annotation : parameter.getParameterAnnotations()) { + if(annotation instanceof PageableDefaults) { + PageableDefaults defaults = (PageableDefaults)annotation; + pr = new PageRequest(defaults.pageNumber(), defaults.value()); + break; + } + } + if(null == pr) { + int page = DEFAULT_PAGE; + String sPage = request.getParameter(config.getPageParamName()); + if(StringUtils.hasText(sPage)) { + try { + page = Integer.parseInt(sPage); + } catch(NumberFormatException ignored) { + } + } + int limit = config.getDefaultPageSize(); + String sLimit = request.getParameter(config.getLimitParamName()); + if(StringUtils.hasText(sLimit)) { + try { + limit = Math.min(Integer.parseInt(sLimit), config.getMaxPageSize()); + } catch(NumberFormatException ignored) { + } + } - Sort sort = null; - List orders = new ArrayList(); - String[] orderValues = request.getParameterValues(config.getSortParamName()); - if(null != orderValues) { - for(String orderParam : orderValues) { - String sortDir = request.getParameter(orderParam + ".dir"); - Sort.Direction dir = (null != sortDir ? Sort.Direction.valueOf(sortDir.toUpperCase()) : Sort.Direction.ASC); - orders.add(new Sort.Order(dir, orderParam)); - } - if(!orders.isEmpty()) { - sort = new Sort(orders); - } - } + Sort sort = null; + List orders = new ArrayList(); + String[] orderValues = request.getParameterValues(config.getSortParamName()); + if(null != orderValues) { + for(String orderParam : orderValues) { + String name = repoMapping.getNameForPath(orderParam); + String sortDir = request.getParameter(orderParam + ".dir"); + Sort.Direction dir = (null != sortDir ? Sort.Direction.valueOf(sortDir.toUpperCase()) : Sort.Direction.ASC); + orders.add(new Sort.Order(dir, name)); + } + if(!orders.isEmpty()) { + sort = new Sort(orders); + } + } - if(null != sort) { - pr = new PageRequest(page - 1, limit, sort); - } else { - pr = new PageRequest(page - 1, limit); - } - } + if(null != sort) { + pr = new PageRequest(page - 1, limit, sort); + } else { + pr = new PageRequest(page - 1, limit); + } + } - return new PagingAndSorting(config, pr); - } + return new PagingAndSorting(config, pr); + } }