显然,Spring (4.3)优先接受查询参数,而不是路径变量,允许它们在使用带有路径变量的@RequestMapping
时覆盖路径变量,并将请求值绑定到模型类。给定如下所示的控制器:
@Controller
@RequestMapping("/")
public class HelloWorldController {
@RequestMapping(value = "/hi/{name}", method = RequestMethod.GET)
public @ResponseBody Greeting sayHello(
@Valid HelloParams helloParams) {
return new Greeting(helloParams.toString());
}
如果我们请求诸如/hi/good?name=bad
这样的URL,我们将看到name
param的值为"bad“。因此,{name}
位置中URL路径中的"good“值将被查询参数忽略或覆盖。如果删除"name“查询参数,则会得到"good”值。
注意:我使用的是一个模型类,这样我就可以对模型的多个字段进行验证。我不能仅仅通过对一个简单的方法参数使用@PathVariable
来修复这个问题。
为什么会这样?文档中没有提到这种行为。
有什么解决办法来防止它的发生吗?
Spring的这种行为似乎也让Springfox感到困惑:在本例中,Swagger生成URL,如:/hi/{name}?name=foo
(URL中有文字花括号)。而且,奇怪的是,由于上面描述的行为,它可以工作。然而,这对使用API的人是误导的,因为他们应该使用路径参数!
发布于 2019-10-11 13:58:49
这和我的问题完全一样。我的解决方案是@ApiImpl时Solution。我的Spring示例(使用Lombok)代码如下所示。
@ApiOperation(value = "Test API.")
@RequestMapping(value = "/test/{memberId}", method = RequestMethod.GET)
@ApiImplicitParams({
@ApiImplicitParam(name = "memberId", value = "member identification number", paramType = "path", dataType = "long", required = true)
})
public ResponseEntity<String> testMethod(@Valid CommandObject command) {
return "hello, world~"
}
@Setter
@Getter
@ToString
@NoArgsConstructor
@AllArgsConstructor
public class CommandObject {
private long memberId
}
@ CommandObject的字段名是field的字段名。重要的部分是paramType。它的值是路径还是查询。路径变量的路径和查询参数的查询。
另外,请参阅文档:http://docs.swagger.io/swagger-core/v1.5.X/apidocs/index.html?io/swagger/annotations/ApiModelProperty.html
发布于 2017-11-22 22:15:10
如果您希望对requestparam和路径变量使用相同的变量,那么您可以创建如下方法:
@RequestMapping(value = "/hi/{name}", method = RequestMethod.GET)
public @ResponseBody String sayHello(@PathVariable(value="name") String name1, @RequestParam(value="name") String name2)
https://stackoverflow.com/questions/47442926
复制相似问题