Spring отвечает 400 с параметром запроса массива - PullRequest
0 голосов
/ 10 февраля 2019

У меня есть следующее сопоставление запроса весенней загрузки @RestController:

@RequestMapping({"/api/blog"})
@RestController
public class BlogController {

   @RequestMapping(value = "/test", method = RequestMethod.GET)
   public Iterable<Blog> filterBy(
        @RequestParam(required = false, name = "filter") String filterStr,
        @RequestParam(required = false, name = "range") String rangeStr,
        @RequestParam(required = false, name="sort") String sortStr) {

           ...
   }
}

Запрос должен выглядеть следующим образом:

GET http://my.api.url/api/blog/test?sort=['title','ASC']&range=[0, 24]&filter={title:'bar'}

Однако, предоставляя любой из параметров запроса массива (диапазон и/ или сортировка) вызывает ответ 400 без каких-либо подробностей, кроме: «HTTP Status 400 - Bad Request»

Выполнение запроса только с запросом filer работает.Добавление диапазона и / или сортировки с нулевыми значениями работает.Вскоре, когда я добавляю скобки [], кажется, что это не удается.

Я попытался добавить следующий обработчик исключений, чтобы отладить проблему как для контроллера, так и для класса ControllerAdvice:

@ExceptionHandler
@ResponseStatus(HttpStatus.BAD_REQUEST)
public void handle(HttpMessageNotReadableException e) {
  logger.warn("Returning HTTP 400 Bad Request", e);
}

Однако это не срабатывает.У меня есть подозрение, что что-то происходит в фреймворке, вызывая 400, прежде чем он даже попадет в контроллер.

Любая помощь приветствуется.

Ответы [ 2 ]

0 голосов
/ 10 февраля 2019

Попробуйте определить свои параметры как Lists и не используйте скобки.

    @RequestMapping(value = "/test", method = RequestMethod.GET)
    public Iterable<Blog> filterBy(
        @RequestParam(required = false, name = "filter") List<String> filterStr,
        @RequestParam(required = false, name = "range") List<String> rangeStr,
        @RequestParam(required = false, name = "sort") List<String> sortStr) {

     filterStr.forEach(s -> System.out.print(", "+ s));
     System.out.println();
     rangeStr.forEach(s -> System.out.print(", "+ s));
     System.out.println();
     sortStr.forEach(s -> System.out.print(", "+ s));
     System.out.println();
     return new ArrayList<>();
    }

    // test url with mockmvc  
    @Test
    public void filterBy() throws Exception {
        mockMvc.perform(get("/test?filter=1,2,3,4&range=5,7,8&sort=desc"))
            .andExpect(status().is2xxSuccessful());
    }

    @Test
    public void filterBy() throws Exception {
       mockMvc.perform(get("/test?filter=1&filter=2&filter=3&filter=4&range=[5,7,8]&sort=desc"))
            .andExpect(status().is2xxSuccessful());
    }

Для меня первый тест печатает:

, 1, 2, 3, 4
, 5, 7, 8
, desc

Второй тест печатает:

, 1, 2, 3, 4
, [5, 7, 8] // brackets dont seem to work that good
, desc
0 голосов
/ 10 февраля 2019

Вы должны URL закодировать ваши параметры!при тестировании URL-адрес должен кодировать фильтр, диапазон и параметры сортировки.Попробуйте следующее:

 http://my.api.url/api/blog/test?sort%3D%5B%27title%27%2C%27ASC%27%5D%26range%3D%5B0%2C+24%5D%26filter%3D%7Btitle%3A%27bar%27%7D
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...