Как принять несколько дополнительных параметров в сопоставлении запроса Spring, но только по одному за раз? - PullRequest
0 голосов
/ 27 марта 2020

Редактировать: я сам решил проблему путем дополнительных экспериментов. Код кажется довольно многословным, хотя, вероятно, есть лучшее решение, которое не включает в себя приведение строк к другим вещам.

Ответ опубликован ниже.


Для моей школьной работы я предполагается создать отображение GET для получения списка всех сущностей определенного c типа. Это отображение GET должно просто возвращать все сущности, если не указан параметр, или иначе оно будет применять что-либо в хранилище сущностей для использования запроса JPQL и предоставленного параметра, который используется в качестве порядкового параметра запроса для фильтрации возвращаемых результатов.

"Если параметр запроса не предоставлен, существующая функциональность возврата всех событий должна быть сохранена. Если указано более одного параметра запроса, должен быть возвращен ответ об ошибке, указывающий, что может быть не более одного параметра. Если указан параметр «? status = XXX» со значением строки состояния, которое не соответствует перечислению AEventStatus, должен быть возвращен соответствующий ответ об ошибке. "

Я попытался изменить мое отображение GET содержит 3 необязательные переменные @RequestParameter, но я обнаружил, что это утомительная логика c -wise, чтобы проверить наличие нескольких параметров или их нет, а затем сделать что-то еще раз, основываясь на существовании того, какой параметр существует ,

Вместо этого я попробовал это (я был в середине этого, и это не завершено):

  @RequestMapping(
    value="/aevents",
    method = RequestMethod.GET)
  public ResponseEntity<Object> getAllAEvents(HttpServletRequest request) {
    if (request.getParameterMap().size() == 0) {
      return ResponseEntity.status(HttpStatus.OK).body(repository.findAll());
    }
    if (request.getParameterMap().size() > 1) {
      return new ResponseEntity<>("Can only handle one request paramter: title=, status= or minRegistrastions=", HttpStatus.BAD_REQUEST);
    }
    //incomplete from here
  }

И теперь я не уверен, является ли это правильным подходом или я просто упускать из виду что-то. Я предполагаю, что смогу проверить имена параметров, которые были предоставлены в запросе, а затем снова вернуть неверный ответ на запрос, если я найду что-то, что не является допустимым параметром. Но я не уверен, как проверить карту параметров для имен параметров или если карта параметров даже делает то, что я думаю, что она делает.

Предполагается, что предоставленные параметры будут либо int, либо значением из перечисление или строка.

Я пропускаю более простой способ сделать это? то есть способ проверить количество параметров и наличие параметров в сигнатуре, например:

  @GetMapping("/aevents")
  public List<AEvent> getAllAEvents(@RequestParam(required = false) String title,
                                    @RequestParam(required = false) AEventStatus status,
                                    @RequestParam(required = false) int minRegistrations) {
                                        //Do something here
                                  }

Или мой нынешний подход осуществим, и если это так, как мне продолжить его?

Ответы [ 2 ]

1 голос
/ 27 марта 2020

Да, вы, скорее всего, сделаете это по-своему, однако:

  1. Вы можете вставить карту параметров непосредственно в Spring.
  2. Бросить исключение ResponseStatusException (доступно с Весна 5) вместо того, чтобы возиться с ResponseEntity.

    @GetMapping("/aevents")
    public List<AEvent> getAllAEvents( @RequestParam Map<String, String> allRequestParams){
    
      if(allRequestParams.size() >1){
          throw new ResponseStatusException(
                HttpStatus.BAD_REQUEST,"too many params");
      }
    
      // do something
      return list;
    }
    
0 голосов
/ 27 марта 2020

Ответьте на мой собственный вопрос после его решения:

Что такое карта параметров? ПараметрMap на самом деле является картой строковых ключей и строковых массивов. Чтобы получить значение для имени параметра (ключа), вы можете получить значения этого ключа и затем обращаться к нему как к массиву. Тем не менее, использование параметраMap не было необходимости. Вместо этого было бы лучше просто использовать встроенный способ Spring, который заключается в использовании аннотации @RequestParam с просто @RequestParam Map<String, String> params в теле метода.

Кредиты на { ссылка } за то, что дал мне идею, а также предоставил лучший способ генерировать исключения.

  @GetMapping("/aevents")
  public List<AEvent> getAllAEvents(@RequestParam Map<String, String> params) {
    if (params.size() == 0) { //Default case, no params
      return repository.findAll();
    }
    if (params.size() > 1) { //Refuse to handle more than one provided param
      throw new ResponseStatusException(HttpStatus.BAD_REQUEST, "Can only handle one request parameter: title=, status= or minRegistrations=");
    }
    if (params.containsKey("title")) {
      String value = params.get("title");
      return repository.findByQuery("AEvent_find_by_title", ("%" + value + "%"));
    }
    if (params.containsKey("status")) {
      String stringValue = params.get("status").toUpperCase();
      for (AEventStatus e : AEventStatus.values()) {
        if (e.name().equals(stringValue)) {
          AEventStatus value = AEventStatus.valueOf(stringValue);
          return repository.findByQuery("AEvent_find_by_status", value);
        }
      }
      throw new ResponseStatusException(HttpStatus.BAD_REQUEST, "status=" + stringValue + " is not a valid AEvent status value.");
    }
    if (params.containsKey("minRegistrations")) {
      int value;
      try {
        value = Integer.parseInt(params.get("minRegistrations"));
      } catch (NumberFormatException e) {
        throw new ResponseStatusException(HttpStatus.BAD_REQUEST, "Provided request parameter was not a valid number.");
      }
      return repository.findByQuery("AEvent_find_by_minRegistrations", value);
    }
    throw new ResponseStatusException(HttpStatus.BAD_REQUEST, "Invalid query parameters.");
  }
...