Сопоставление запросов в RestController - PullRequest
0 голосов
/ 13 июля 2020

В моем приложении (springboot 2. +) у меня есть RestController, например

@RestController
@RequestMapping("/")
public class DeviceController {

   @GetMapping(value = "/devices") {
   public ResponseEntity<String> devices() {
    ...
   }
 }
}

Теперь запрос с URI: / devices - возвращает все устройства

Но запрос с URI: / devices? Unknown_any_param = 2 - также возвращает все устройства

Как я могу сделать так, чтобы при передаче любых неизвестных параметров этот метод devices() не вызывается, т.е. возвращает ошибку «400 Bad request»?

Я пытался указать аннотацию, например @GetMapping (value = "/ devices", params = {}), но это не помогло.

Ответы [ 2 ]

1 голос
/ 13 июля 2020

Вы можете получить все переданные параметры, как показано ниже

public ResponseEntity<String> devices(
@RequestParam Map<String,String> requestParameters)

Теперь проверьте их ключи, если параметр запроса передает действительный список параметров, иначе

return new ResponseEntity<>(HttpStatus.BAD_REQUEST);
0 голосов
/ 14 июля 2020

Я считаю, что вам следует ответить 404 «НЕ НАЙДЕНО», поскольку такого устройства нет с unknown_any_param = 2.

Тем не менее, если вы хотите проверить -

Вы можете использовать Reflection API, чтобы проверить, действителен ли ключ. Рассмотрим-

public class DeviceDto{
    private String knownValue;
    @JsonProperty("unknown_any_param")
    private String unknownValue;
}

случай 1: Если параметр такой же, как имя переменной.

DeviceDto.class.getDeclaredField("knownValue");

случай 2: Если параметр такой же, как значение в @JsonProperty, и вы знаете переменную name

DeviceDto.class.getDeclaredField("unknownValue")
     .getAnnotation(JsonProperty.class)
     .value();

case 2: Если параметр такой же, как значение в @JsonProperty, и вы не знаете имя переменной

Arrays.asList(DeviceDto.class.getDeclaredFields()).stream()
     .filter(r -> "unknown_any_param"
                       .equals(r.getAnnotation(JsonProperty.class).value()))
     .findFirst();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...