如何让Spring 3.0控制器触发404?
我有一个控制器@RequestMapping(值= "/**",方法= RequestMethod.GET)和一些访问控制器的url,我希望容器提出一个404。
如何让Spring 3.0控制器触发404?
我有一个控制器@RequestMapping(值= "/**",方法= RequestMethod.GET)和一些访问控制器的url,我希望容器提出一个404。
当前回答
这有点晚了,但如果你正在使用Spring Data REST,那么已经有org.springframework.data.rest.webmvc.ResourceNotFoundException 它还使用@ResponseStatus注释。不再需要创建自定义运行时异常。
其他回答
重写你的方法签名,使它接受HttpServletResponse作为参数,这样你就可以对它调用setStatus(int)。
http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/mvc.html#mvc-ann-requestmapping-arguments
从Spring 5.0开始,你不需要创建额外的异常:
throw new ResponseStatusException(NOT_FOUND, "Unable to find resource");
此外,你可以用一个内置异常覆盖多个场景,你有更多的控制。
看到更多:
ResponseStatusException (javadoc) https://www.baeldung.com/spring-response-status-exception
从Spring 3.0开始,你还可以抛出一个用@ResponseStatus注释声明的Exception:
@ResponseStatus(value = HttpStatus.NOT_FOUND)
public class ResourceNotFoundException extends RuntimeException {
...
}
@Controller
public class SomeController {
@RequestMapping.....
public void handleCall() {
if (isFound()) {
// whatever
}
else {
throw new ResourceNotFoundException();
}
}
}
从Spring 3.0.2开始,你可以返回ResponseEntity<T>作为控制器方法的结果:
@RequestMapping.....
public ResponseEntity<Object> handleCall() {
if (isFound()) {
// do what you want
return new ResponseEntity<>(HttpStatus.OK);
}
else {
return new ResponseEntity<>(HttpStatus.NOT_FOUND);
}
}
(ResponseEntity<T>是一个比@ResponseBody注释更灵活的注释-参见另一个问题)
我建议抛出HttpClientErrorException,就像这样
@RequestMapping(value = "/sample/")
public void sample() {
if (somethingIsWrong()) {
throw new HttpClientErrorException(HttpStatus.NOT_FOUND);
}
}
您必须记住,这只能在将任何内容写入servlet输出流之前进行。