Запретите параметры множественной сортировки с помощью Pageable в Spring REST Controllers - PullRequest
0 голосов
/ 25 апреля 2018

Я работаю с API, используя репозитории Spring Boot и Spring Data (но не Spring Data REST).

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

Вышеописанное работает отлично.Я могу хорошо отсортировать, передав параметр sort, однако меня немного беспокоит влияние на производительность.

Я бы хотел ограничить его поддержкой только сортировки по одному параметру за раз для производительности.причины.По умолчанию я могу сделать что-то вроде ?sort=name,createdAt, что сгенерирует запрос на заказ как name, так и createdAt.Учитывая, что это публичный API, я немного обеспокоен тем, что некоторые пользователи злоупотребляют этим и пытаются сортировать по целому ряду значений, для которых мы не оптимизировали.

Во-вторых, есть некоторые значения, которые не 'не имеет смысла для сортировки.Например, если бы у Foo был URL-адрес эскиза, сортировать по thumbnail не имеет смысла.Есть ли возможность занести в белый или черный список значения сортировки?

1 Ответ

0 голосов
/ 25 апреля 2018

вы можете сделать свою CustomSortHandlerMethodArgumentResolver (реализует org.springframework.data.web.SortArgumentResolver реализацию пружины 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);
    } 
}

, в пользовательской реализации вы можете создавать белые / черные списки и настраивать обработку сортировки так, чтобыВам удобно, и чтобы избежать распространенных ошибок - посмотрите реализацию пружины

одним из способов

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