Spring MVC - 如何在缺少的参数上返回404

时间:2012-04-29 13:53:44

标签: java spring-mvc

每当我没有传递所有参数时,我想触发404页面。假设我有以下URI:

/myapp/op?param1=1&param2=2@param3=3

如果参数wasn; t调用,我想返回404页面。我试过了:

@ResponseStatus(HttpStatus.NOT_FOUND)
@RequestMapping(value = "op", params = { "!param1" })
public void missingArg() {
}

然后我得到一个例外,告诉我处理缺少第二个和第三个参数的方法之间存在歧义。

那我怎么能做到这一点呢?

3 个答案:

答案 0 :(得分:27)

如果你使用的是Spring 3.1,你可以像这样定义一个异常类:

@ResponseStatus(value = HttpStatus.NOT_FOUND)
public final class ResourceNotFoundException extends RuntimeException {
   //  class definition
}

现在无论何时抛出该异常,Spring都会返回@ResponseStatus注释中定义的http状态。例如:

@RequestMapping(value = "/op")
public void methodWithRequestParams(@RequestParam(value = "param1", required = false) String param1, 
        @RequestParam(value = "param2", required = false) String param2) {
  if (param1 == null || param2 == null) {
    throw new ResourceNotFoundException();
  }
}
每当404param1为空时,

都会返回param2

答案 1 :(得分:7)

您不必实施missingArg()功能。如果传入请求没有匹配的方法,那么Spring的HandlerExceptionResolver将处理它并返回带有适当状态代码的响应。

如果使用@RequestParam注释:

,Spring会自动将请求参数转换为方法参数
@RequestMapping(value = "/op")
public void methodWithRequestParams(@RequestParam("param1") String param1, 
        @RequestParam("param2") String param2, 
        @RequestParam("param3") String param3) {

    // do something with params
}

按照惯例,如果并非所有参数都是请求的一部分,则不会调用methodWithRequestParams()方法(除非required的{​​{1}}属性设置为@RequestParam )。

另请注意,参数不一定是字符串。

答案 2 :(得分:1)

回应matsev在另一个答案的评论中所说的内容,在这种情况下你不应该使用@ResponseStatus(HttpStatus.NOT_FOUND),而是@ResponseStatus(HttpStatus.BAD_REQUEST)

正确形成请求时应使用

@ResponseStatus(HttpStatus.NOT_FOUND),但资源不存在。