gpt4 book ai didi

java - 在 Spring REST Controller 中使用 Pageable 防止多个排序参数

转载 作者:行者123 更新时间:2023-12-02 02:11:06 24 4
gpt4 key购买 nike

我正在使用 Spring Boot 和 Spring Data 存储库(尽管不是 Spring Data REST)开发 API。

@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.SortArgumentResolverspring实现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);
}
}

在自定义实现中,您可以创建白/黑名单并自定义排序规则的处理,以便您方便,并避免常见错误 - 参见 spring 的实现

方法之一

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

关于java - 在 Spring REST Controller 中使用 Pageable 防止多个排序参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50021484/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com