@RestController类,带有两个@RequestMappings,两个都具有相同的端点,一个没有参数,另一个带参数

时间:2018-04-27 10:55:15

标签: java rest spring-boot

我正在尝试创建一个安静的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 :(得分:1)

感谢您的建议,我发现这对我有用。它需要添加defaultValue。

@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);
    }
}

答案 1 :(得分:0)

不,不可能。为什么不用可选参数创建一个端点?

检查类似问题的其他答案:

Spring MVC using same path on endpoints to return different content?

Two GET methods with different query parameters : REST

答案 2 :(得分:0)

您可以使用Java 8和Spring执行类似于返回类型String

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

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

答案 3 :(得分:0)

除了Java 8的可选@RequestParam之外,您还可以执行以下操作:在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
}

答案 4 :(得分:0)

是的,这确实是可能的。您似乎想要一个端点,但需要一个可选的delta参数。

要实现这一点,你只需要在你的方法上使用一个@RequestMapping注释,所有的Spring仪式都会在参数上进行,例如:

@RequestMapping(value = “/time”)
public TimeResponse time(@RequestParam(required = false) Integer delta) {
     if (delta == null) { 
          // default case
     }
          // case where delta is present 
}