Java 使用Spring REST控制器中的可分页功能防止多个排序参数
我正在使用springboot和springdatarepos(虽然不是springdatarest)开发一个APIJava 使用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参数进行良好排序,但是我有点担心性能影响 出于性能原因,我想将其限制为一次只支持
@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;
}
}