如何在 @RequestMapping 参数中检查请求参数不为空字符串?

15
在我的控制器中,我有一个字符串参数,包含一些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)。

最可能的情况是我需要在控制器代码中检查它,比如:

if (id == null || id.isEmpty()) {
    return someErrorResponse;
}

但是如果我错了,请纠正我。提前致谢。

附言:我的应用运行在Java 1.7 SE和Apache Tomcat 7.0.62容器上。

3个回答

12

根据使用该注释的Spring代码

org.springframework.web.servlet.mvc.annotation.ServletAnnotationMappingUtils.checkParameters(String[], HttpServletRequest)

类似这样的代码应该可以正常工作:

@RequestMapping(value = someURL, params = {"id!="})
public SomeResponse doSomething(@RequestParam(required = true) String id)

我注意到即使我在请求头中留下了一个空白字段,也会得到状态码400,因此 'required=true' 并不是必需的: {"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/"} - user3105453
谢谢,我认为这就是我需要的。当我按照您提出的方式定义注释,在控制器方法的开头设置断点并运行测试时,我 a) 没有进入控制器方法;b) 得到了自解释异常 org.springframework.web.bind.UnsatisfiedServletRequestParameterException:实际请求参数未满足参数条件 "id!=":id={}。 - WeGa
WeGa,你是如何解决的?能否详细说明一下? - asifaftab87

10

如果你想符合Java EE的验证规范,请使用@Size(min=1)

Hibernate Validator有一个@NotEmpty注释,可以达到同样的目的。但这不是Java规范的一部分。

顺便提一下,保留required=true是因为上面的通知不会强制要求在请求中包含该参数。

编辑回应评论:

Spring符合Java EE验证规范,因此如果您在类路径上拥有一些Java EE验证API实现程序,则@Size注释应该有效。到目前为止,我只使用了Hibernate Validator。所以您可以通过将这个添加到类路径中来启用这些验证功能:

<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端点,这非常重要。它将为您打开新的世界。

从Java EE验证教程开始

Spring文档的相关部分


谢谢回复。我已经更新了我的帖子,并提供了我的环境描述。我不确定它是否与您提供的解决方案兼容。请问,如果输入参数违反这些注释约束,会发生什么?在这种情况下,我应该如何处理这种情况? - WeGa

-4

你可以使用defaultValue,例如

@RequestParam(value = "id", required = true, defaultValue = "-1") String id

但是,你仍然需要使用像if这样的语句

if(id.equals("-1")){
   return "someErrorPage"
}

否则,您可以创建一个过滤器来实现此目的,如下面的示例所示:

如何在Java中使用Servlet过滤器更改传入的Servlet请求URL?


谢谢回复。但是,我的手动参数检查难道不比你的解决方案更好吗? - WeGa
不仅“没有什么帮助”,而且是完全错误的。defaultValue 仅在未指定参数时使用,它并不涵盖“为空”的情况。 - kryger

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接