在 Spring REST 控制器中使用 Pageable 防止多个排序参数

Prevent multiple sort parameters with Pageable in Spring REST Controllers

我正在 API 使用 Spring 启动和 Spring 数据存储库(尽管不是 Spring 数据 REST)。

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

以上工作正常。我可以通过传递 sort 参数进行排序,但是我有点担心性能影响。

出于性能原因,我想将其限制为一次仅支持按单个参数排序。默认情况下,我可以执行类似 ?sort=name,createdAt 的操作,它会生成一个查询以按 namecreatedAt 排序。鉴于它是 public API,我有点担心某些用户会滥用它并尝试按我们尚未优化的一大堆值进行排序。

其次,有些值对排序没有意义。例如,如果 Foo 有缩略图 URL,按 thumbnail 排序就没有意义。是否可以将排序值列入白名单或黑名单?

你可以让你的 CustomSortHandlerMethodArgumentResolver ( 实现 org.springframework.data.web.SortArgumentResolver spring 实施 org.springframework.data.web.SortHandlerMethodArgumentResolver)

@Configuration
@EnableWebMvc
public class WebMvcContext extends WebMvcConfigurerAdapter {

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

        argumentResolvers.add(handler);
    } 
}

在自定义实现中,您可以创建 white/black 列表并自定义排序规则的处理,以方便您,并避免常见错误 - 请参阅 spring[=15 的实现=]

其中一种方式

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;
    }
}