如何检查@RequestMapping 参数中的请求参数是不是为空字符串?
Posted
技术标签:
【中文标题】如何检查@RequestMapping 参数中的请求参数是不是为空字符串?【英文标题】:How to check request parameter is not empty String in @RequestMapping params?如何检查@RequestMapping 参数中的请求参数是否为空字符串? 【发布时间】:2015-12-05 04:56:21 【问题描述】:在我的控制器中,我有 String 参数,其中包含一些 id,它不应该是空字符串的 null。我想知道,有什么方法可以检查@RequestMapping 参数中的字符串是否为空? 我试图以某种方式解决它
@RequestMapping(value = someURL, params = "id")
public SomeResponse doSomething(@RequestParam(required = true) String id)
@RequestMapping(value = someURL, params = "!id=")
public SomeResponse doSomething(@RequestParam(required = true) String id)
@RequestMapping(value = someURL, params = "!id=\"\"")
public SomeResponse doSomething(@RequestParam(required = true) String id)
没有成功。
据我了解,params = "id"
和@RequestParam(required = true)
都只能检查参数id
是否出现在请求中(!= null)。
很可能我必须使用控制器 boby 中的代码来检查这一点,例如
if (id == null || id.isEmpty())
return someErrorResponse;
但如果我错了,请纠正我。 提前致谢。
附:我的应用在 Apache Tomcat 7.0.62 容器中的 Java 1.7 SE 上运行
【问题讨论】:
【参考方案1】:根据使用该注释的 Spring 代码
org.springframework.web.servlet.mvc.annotation.ServletAnnotationMappingUtils.checkParameters(String[], HttpServletRequest)
这样的事情应该可以工作:
@RequestMapping(value = someURL, params = "id!=")
public SomeResponse doSomething(@RequestParam(required = true) String id)
【讨论】:
我注意到 'required = true' 甚至没有必要,因为当我遗漏了标题字段时,我得到了状态 400:"status":400,"error":"Bad Request","exception":"org.springframework.web.bind.ServletRequestBindingException","message":"Missing request header 'X-Custom-Header' for method parameter of type String","path":"/api/"
谢谢,我想这就是我需要的。当我按照您建议的方式定义注释时,在控制器方法的开头放置断点并运行测试,我 a) 没有进入控制器方法; b) 得到自我解释的异常 org.springframework.web.bind.UnsatisfiedServletRequestParameterException: 参数条件 "id!=" not met for actual request parameters: id=.
WeGa 你是怎么解决的?请详细说明一下。【参考方案2】:
如果您希望在验证方面符合 Java EE,请使用 @Size(min=1)
。
Hibernate Validator 有 @NotEmpty
用于此目的的注释。但这不是 Java 规范的一部分。
顺便说一句,保持required=true
上面的通知不会强制要求参数的存在。
编辑对评论的反应:
Spring 兼容 Java EE 验证,因此如果您在类路径上有一些 Java EE 验证 API 实现程序,@Size 注释应该可以工作。到目前为止,我只使用了休眠验证器。因此,您可以通过将其添加到类路径中来启用这些验证功能:
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>5.2.1.Final</version>
</dependency>
您可以使用 @Validated
注释来注释控制器并执行以下操作:
@RequestMapping(value = someURL, params = "id")
public SomeResponse doSomething(@RequestParam(required = true) @Size(min=1) String id)
您还可以自定义将发送给客户端的错误消息。
如果您不熟悉 Java EE 验证,我建议您开始研究它,因为如果您正在创建 REST/HTTP 端点,它非常重要。它将为您打开新的世界。
Start with Java EE Tutorial for validation
Relevant part of Spring doc
【讨论】:
感谢您的回复。我已经用我拥有的环境描述更新了我的帖子。我不确定它是否与您提供的解决方案兼容。请告诉我,如果输入参数违反这些注释约束会发生什么?这种情况应该怎么处理?【参考方案3】:你可以使用defaultValue
@RequestParam(value = "id", required = true, defaultValue = "-1") String id
但是,你必须再次使用 if like
if(id.equals("-1"))
return "someErrorPage"
否则,您可以为此目的创建一个过滤器,如本例所示
How to use a servlet filter in Java to change an incoming servlet request url?
【讨论】:
感谢您的回复。但是我的手动参数检查不是比你的解决方案更好吗? 不仅“不是很有帮助”,而且完全是错误的。defaultValue
仅在不指定参数时使用,不涵盖“空白”场景。以上是关于如何检查@RequestMapping 参数中的请求参数是不是为空字符串?的主要内容,如果未能解决你的问题,请参考以下文章
如何获取spring RequestMapping注解所对应的方法及参数类型
带有可选参数的 Spring @RequestMapping