如何检查@RequestMapping 参数中的请求参数是否为空字符串?

How to check request parameter is not empty String in @RequestMapping params?

在我的控制器中,我有一个字符串参数,其中包含一些 id,它不应该是空字符串。我想知道,有什么方法可以检查@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;
}

但如果我错了请指正。 提前致谢。

P.S。我的应用程序 运行 在 Java 1.7 SE in Apache Tomcat 7.0.62 container

如果您想 Java EE 符合验证要求,请使用 @Size(min=1)

Hibernate Validator 具有用于此目的的 @NotEmpty 注释。但这不是 Java 规范的一部分。

顺便说一句,保留 required=true,因为上面的通知不会强制在请求中出现参数。

编辑对评论的反应:

Spring 符合 Java EE 验证,因此如果您在 class 路径上有一些 Java EE 验证 API 实现器,@Size 注释应该可以工作.到目前为止,我只使用了休眠验证器。因此,您可以通过将其添加到 classpath:

来启用这些验证功能
<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

您可以像

那样使用 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?

根据使用该注释的 Spring 代码

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

像这样的东西应该可以工作:

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