我有一个有两个端点的控制器类。
@RestController
@RequestMapping
public class TestController {
@RequestMapping(
value= "/test",
method = RequestMethod.GET)
@ResponseBody
public String getTest() {
return "test without params";
}
@RequestMapping(
value= "/test",
params = {"param"},
method = RequestMethod.GET)
@ResponseBody
public String getTest(@PathParam("param") int param) {
return "test with param";
}
}
一个有参数,另一个没有,两个都能工作。
如果我使用curl或web浏览器访问端点
返回
不带参数的
检验
和
返回
带参数的
测试
但是swagger ui只显示没有参数的ui。
如果我将请求映射中的值更改为
@RequestMapping(
value= "/testbyparam",
params = {"param"},
method = RequestMethod.GET)
Swagger UI正确地显示了两个端点,但我不希望根据swagger将显示或不显示的内容来定义我的端点。
有没有办法让swagger ui正确显示具有匹配值但参数不同的端点?
编辑以澄清:
端点工作得很好;/test和/test?param=1都工作得很好,问题是swagger-ui不会显示它们。
我希望swagger ui能够显示我定义的端点,但是如果它不能,那么我将不得不忍受swagger-ui缺少一些端点。
参照编辑:
在这里回答的人:Proper REST formatted URL with date ranges
显式声明不使用斜杠分隔查询字符串
他们还说“查询字符串前不应该有斜杠。”
发布于 2018-08-16 03:23:24
问题出在您的请求映射中,第二个方法声明覆盖了第一个方法。因为资源映射值相同。
尝试将第二种方法更改为下面的方法。由于您希望在QueryParam而不是path变量中提供输入,因此应该使用@RequestParam而不是@PathParam。
请注意,您必须提供/test/,以便告诉Spring您的映射是不明确的。希望能有所帮助。
@RequestMapping(
value= "/test/",
method = RequestMethod.GET)
@ResponseBody
public String getTest (@RequestParam("param") int param) {
return "test with param"+param;
}
发布于 2021-01-21 23:32:32
在阅读说明时,这里的问题是swagger-ui正在做正确的事情。
您有两个控制器端点,但它们用于接受一组可选查询参数的相同资源/test
。
实际上,具有相同方法(GET
)和请求映射(/test
)的所有映射控制器端点代表单个逻辑资源。test
资源上的GET操作,以及一组可能影响调用该操作的结果的可选参数。
您将其实现为两个独立的控制器端点的事实是一个实现细节,并且不会改变可以对单个/test
资源进行操作的事实。
在swagger UI中将其作为两个单独的端点列出,与使用可选参数的单个端点相比,对API的消费者有什么好处?也许它可以限制允许的有效查询参数集(如果设置了?foo
,则必须设置&bar
),但这也可以在描述性文本中完成,这是一种更标准的方法。就我个人而言,我不熟悉任何公开记录的api,这些api通过查询参数来区分同一资源的多个操作。
发布于 2018-08-16 02:04:12
我不清楚你到底想做什么,但我会给出两个解决方案:
如果你想要路径参数,比如GET /test
& GET /test/123
,你可以这样做:
@GetMapping("/test")
public String getTest() {
return "test without params";
}
@GetMapping("test/{param}")
public String getTest(@PathVariable("param") int param) {
return "test with param";
}
如果需要查询参数(GET /test
和GET /test?param=123
),则需要一个带有可选参数的端点:
@GetMapping("test")
public String getTest(@RequestParam("param") Integer param) {
if(param == null) {
return "test without params";
} else {
return "test with param";
}
}
https://stackoverflow.com/questions/51862871
复制相似问题