Java 使用Spring REST控制器中的可分页功能防止多个排序参数

Java 使用Spring REST控制器中的可分页功能防止多个排序参数,java,spring,sorting,spring-data,spring-restcontroller,Java,Spring,Sorting,Spring Data,Spring Restcontroller,我正在使用springboot和springdatarepos(虽然不是springdatarest)开发一个API @GetMapping 公共列表列表( @SortDefault(value=“name”,direction=Sort.direction.ASC) 可分页可分页, HttpServletRequest(请求){ FooRepo.findAll(可分页); } 以上方法很好。我可以通过传递sort参数进行良好排序,但是我有点担心性能影响 出于性能原因,我想将其限制为一次只支持

我正在使用springboot和springdatarepos(虽然不是springdatarest)开发一个API

@GetMapping
公共列表列表(
@SortDefault(value=“name”,direction=Sort.direction.ASC)
可分页可分页,
HttpServletRequest(请求){
FooRepo.findAll(可分页);
}
以上方法很好。我可以通过传递
sort
参数进行良好排序,但是我有点担心性能影响

出于性能原因,我想将其限制为一次只支持按单个参数排序。默认情况下,我可以执行类似于
?sort=name、createdAt
的操作,这将生成一个查询,以按
name
createdAt
进行排序。考虑到它是一个公共API,我有点担心一些用户滥用它,并试图按一大堆我们没有优化的值进行排序


其次,有些值对于排序没有意义。例如,如果
Foo
有一个缩略图URL,那么按
thumbnail
排序就没有意义了。是否有能力将排序值列入白名单或黑名单?

您可以将
自定义SortHandlerMethodArgumentResolver
(实现
org.springframework.data.web.SortArgumentResolver
spring实现
org.springframework.data.web.SortHandlerMethodArgumentResolver


您可以将
自定义SortHandlerMethodArgumentResolver
(实现
org.springframework.data.web.SortArgumentResolver
spring实现
org.springframework.data.web.SortHandlerMethodArgumentResolver

@GetMapping
public List<Foo> listFoos(
    @SortDefault(value = "name", direction = Sort.Direction.ASC)
    Pageable pageable,
    HttpServletRequest request) {
  FooRepo.findAll(pageable);
}
@Configuration
@EnableWebMvc
public class WebMvcContext extends WebMvcConfigurerAdapter {

    @Override
    public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
        PageableArgumentResolverhandler = new PageableHandlerMethodArgumentResolver(
                new CustomSortHandlerMethodArgumentResolver()); 

        argumentResolvers.add(handler);
    } 
}
public class CustomSortHandlerMethodArgumentResolver extends 
        SortHandlerMethodArgumentResolver{



    @Override
    public Sort resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) {
        Sort sort = super.resolveArgument(parameter, mavContainer, webRequest, binderFactory);

        /*
            additional logic for filtering orders        
         */

        return sort != null && sort.iterator().hasNext() ? new Sort(sort.iterator().next()) : null;
    }
}