Класс @RestController с двумя @RequestMappings, оба с одной и той же конечной точкой, один без параметров и один с параметрами - PullRequest
0 голосов
/ 27 апреля 2018

Я пытаюсь создать успокоительный API (используя Spring Boot v2.0.0.Release), я хочу, чтобы была одна конечная точка, но я бы хотел, чтобы было два возможных варианта использования:

GET /time - outputs current time (e.g. linux epoch in seconds)
GET /time?delta=100000 (time adjusted by the delta in seconds e.g. +ve=future -ve=past)

Во-первых, возможно ли это? а во вторых у кого-нибудь есть пример кода?

Ваша помощь очень ценится

Ответы [ 5 ]

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

Спасибо за ваш совет, я обнаружил, что это работает для меня. Нужно было добавить значение по умолчанию.

@RequestMapping(value = "/time",
                produces = { "text/plain" },
                method = RequestMethod.GET)
public ResponseEntity<String> getTime(@RequestParam(value = "delta",
                                                     required = false,
                                                     defaultValue = "0")
                                                     long delta) {
    if (0L == delta) {
        return new ResponseEntity<String>(calcTime(), HttpStatus.OK);
    }
    else {
        return new ResponseEntity<String>(calcTime(delta), HttpStatus.OK);
    }
}
0 голосов
/ 27 апреля 2018

Да, это действительно возможно. Кажется, что вы хотите одну конечную точку, но с необязательным параметром delta.

Для этого вам нужно всего лишь одну аннотацию @RequestMapping для вашего метода, и вся церемония Spring проходит по параметру, например ::

@RequestMapping(value = “/time”)
public TimeResponse time(@RequestParam(required = false) Integer delta) {
     if (delta == null) { 
          // default case
     }
          // case where delta is present 
}
0 голосов
/ 27 апреля 2018

Вы можете сделать что-то вроде Java 8 и Spring, предполагая тип возвращаемого значения String

@GetMapping("/time")
public String getTime(@RequestParam Optional<Integer> delta) {
   //...
}

или

@RequestMapping("/time")
public String getTime(@RequestParam Optional<Integer> delta) {
    //...
}
0 голосов
/ 27 апреля 2018

Вы можете также выполнить следующие действия, помимо Необязательного @RequestParam в Java 8: передать параметр required=false в @RequestParam

@RestController
class MyClass {

@RequestMapping("/time")
public MyType myEndpoint(@RequestParam(required=false) Integer delta) {
   // if delta is null then it hasn't been provided
}
0 голосов
/ 27 апреля 2018

Нет, это невозможно. Почему бы вам не создать одну конечную точку с необязательными параметрами?

Проверьте другие ответы на похожие вопросы:

Spring MVC использует один и тот же путь на конечных точках для возврата другого содержимого?

Два метода GET с разными параметрами запроса: REST

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...