首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Spring 4.3允许查询参数覆盖@RequestMapping中的路径变量

Spring 4.3允许查询参数覆盖@RequestMapping中的路径变量
EN

Stack Overflow用户
提问于 2017-11-22 19:54:43
回答 2查看 950关注 0票数 3

显然,Spring (4.3)优先接受查询参数,而不是路径变量,允许它们在使用带有路径变量的@RequestMapping时覆盖路径变量,并将请求值绑定到模型类。给定如下所示的控制器:

代码语言:javascript
运行
复制
@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的人是误导的,因为他们应该使用路径参数!

EN

回答 2

Stack Overflow用户

发布于 2019-10-11 13:58:49

这和我的问题完全一样。我的解决方案是@ApiImpl时Solution。我的Spring示例(使用Lombok)代码如下所示。

代码语言:javascript
运行
复制
@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

票数 2
EN

Stack Overflow用户

发布于 2017-11-22 22:15:10

如果您希望对requestparam和路径变量使用相同的变量,那么您可以创建如下方法:

代码语言:javascript
运行
复制
@RequestMapping(value = "/hi/{name}", method = RequestMethod.GET)
    public @ResponseBody String sayHello(@PathVariable(value="name") String name1, @RequestParam(value="name") String name2)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47442926

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档