11

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

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

如果没有调用参数,我想返回 404 页面。我试着做:

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

但后来我得到一个异常,告诉我处理丢失的第二个和第三个参数的方法之间存在歧义。

那我该怎么做呢?

4

3 回答 3

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();
  }
}

404将在任何时候返回 aparam1param2为空。

于 2012-04-29T15:56:21.173 回答
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属性@RequestParam设置为false)。

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

于 2012-04-29T14:33:19.353 回答
1

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

@ResponseStatus(HttpStatus.NOT_FOUND)应该在请求正确形成但资源不存在时使用。

于 2015-05-14T14:48:07.107 回答