每当我没有传递所有参数时,我想触发404页面。假设我有以下URI:
/myapp/op?param1=1¶m2=2@param3=3
如果参数wasn; t调用,我想返回404页面。我试过了:
@ResponseStatus(HttpStatus.NOT_FOUND)
@RequestMapping(value = "op", params = { "!param1" })
public void missingArg() {
}
然后我得到一个例外,告诉我处理缺少第二个和第三个参数的方法之间存在歧义。
那我怎么能做到这一点呢?
答案 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();
}
}
每当404
或param1
为空时,都会返回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)
,但资源不存在。