如何检查@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注解所对应的方法及参数类型

如何使用 mockMvc 检查响应正文中的 JSON

如何使用mockMvc检查响应体中的JSON

带有可选参数的 Spring @RequestMapping

SSMSpringMVC中的@RequestMapping注解(含源码解析)

如何知道 node.js 中的请求是 http 还是 https