【问题标题】:Spring MVC @Path variable with null value具有空值的 Spring MVC @Path 变量
【发布时间】:2017-10-25 08:55:09
【问题描述】:

我正在使用 Spring Boot 开发应用程序。在资源中使用路径变量(**@PathVariable** 注释)和请求参数(**@RequestParam("name")** 注释)。我的代码获取请求参数值而不是路径变量值,我将路径变量值设为空。请任何人建议我解决这个问题。

@RequestMapping(value = "/api/user/{id}", method = RequestMethod.GET)  
public void get(@RequestParam("name")  String name, @PathVariable Integer id); {

        System.out.println("name="+name);
        System.out.println("id="+id)
}

网址:
http://localhost:8080/api/user/2?name=neeru

输出:
名称=neeru
id=null

我也试过了

**@RequestMapping(value = "/api/user/id={id}", method = RequestMethod.GET)** 

网址:
http://localhost:8080/api/user/id=2?name=neeru 但得到相同的 id 值=null

我又增加了一种方法——只有@PathVariable

@RequestMapping(path="/api/user/name/{name}", method = RequestMethod.GET)    
   void get( @PathVariable("value=name") String name){

   System.out.println("name="+name)
}

但结果是相同的路径变量值 name=null

【问题讨论】:

  • 你能试试用 api/user/{id} 代替 api/user/id={id} 吗?
  • 是的,我尝试了 api/user/id={id}?name=abc 但得到了相同的 id 空值
  • 为路径变量设置一个名称,如@PathVariable(name="id") 以便解析..
  • 是的,尝试了 @PathVariable(name="id") 和 @PathVariable(value="id") ,两者都不起作用
  • 你打错了...应该是@PathVariable(value="name") 而不是@PathVariable("value=name")

标签: java spring spring-mvc spring-boot


【解决方案1】:
  1. @PathVariable是从uri中获取一些占位符
  2. @RequestParam是获取一个参数

像这样改变你的端点

http://localhost:8080/api/user/2/users?name=neeru

`

@RequestMapping(value = "api/user/{id}/users", method = RequestMethod.GET)  
public void get(@RequestParam("name")  String name, @PathVariable("id") Integer id); {
        System.out.println("name="+name);
        System.out.println("id="+id)
}

`

输出:

名字=尼鲁

id = 2

【讨论】:

  • 未尝试工作,@RequestMapping(path="api/user/{id}/users", method = RequestMethod.GET) void get(@RequestParam("name") 字符串名称,@PathVariable ("id") 整数 id);和网址:localhost:8080/api/user/id/2/users?name=neeru
  • 可能是,对不起,但不适合我。这也是前stackoverflow.com/questions/26794198/…。我也做过,但不知道为什么它不起作用
  • 看我的问题,我附上了截图,告诉我我在哪里做错了
  • 谢谢,实际上我有 UserResource 接口和 UserResourceImpl 类,在 Spring Boot 中 PathVariable 注释不是从接口继承的,我在接口上使用 @PathVariable 这就是为什么它不起作用但现在我在使用 PathVariable 注释UserResouceImpl 也是如此,现在它对我有用。
【解决方案2】:

@PathVariable 用于提取路径中的变量,如 MystyxMac 建议的那样。如果要提取查询参数,则必须使用@RequestParam

但是您的示例是路径和查询参数的混合。

您不能在 URL 中使用 =,因为这是一个保留字符:https://www.w3.org/Addressing/URL/url-spec.txt

所以要么使用

/api/user/{id} with @PathVariable 

/api/user?id={id} with @RequestParam

【讨论】:

  • 我正在尝试 /api/user/{id} 与 @PathVariable 但得到空值 id,不知道为什么我将路径变量值设为空
  • 我正在尝试为这样的场景编写 API 测试用例。如果端点被称为 /api/user/null 它应该给出客户端错误(4xx)还是服务器错误(5xx)?
  • 总是 4xx,因为 5xx 是服务器错误,表明您的应用程序有错误
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-27
  • 1970-01-01
  • 2014-01-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多