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

s0l*_*0li 11 java spring-mvc

每当我没有通过所有参数时,我想触发404页面.假设我有以下URI:

/myapp/op?param1=1&param2=2@param3=3
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

Tim*_*ote 27

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

@ResponseStatus(value = HttpStatus.NOT_FOUND)
public final class ResourceNotFoundException extends RuntimeException {
   //  class definition
}
Run Code Online (Sandbox Code Playgroud)

现在,无论何时抛出该异常,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();
  }
}
Run Code Online (Sandbox Code Playgroud)

将返回404when param1param2null.


mat*_*sev 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
}
Run Code Online (Sandbox Code Playgroud)

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

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

  • 好吧,在我看来,"400 - 错误请求"是一个更准确的响应代码,即"404".在所有资源(由`/ op` url标识)存在之后,但请求参数是错误的,即一个错误的请求.如果你想要一个特定的资源和'404`响应,如果它不存在,我建议你使用`@RequestMapping("/ op/{id}")`和[@PathVariable](http:/ /static.springsource.org/spring/docs/3.1.x/spring-framework-reference/html/mvc.html#mvc-ann-requestmapping-uri-templates)注释. (8认同)