如何让Spring 3.0控制器触发404?
我有一个控制器@RequestMapping(值= "/**",方法= RequestMethod.GET)和一些访问控制器的url,我希望容器提出一个404。
如何让Spring 3.0控制器触发404?
我有一个控制器@RequestMapping(值= "/**",方法= RequestMethod.GET)和一些访问控制器的url,我希望容器提出一个404。
当前回答
你可以使用@ControllerAdvice来处理异常, 默认行为@ControllerAdvice注释类将帮助所有已知的控制器。
因此,当任何控制器抛出404错误时,它将被调用。
像下面这样:
@ControllerAdvice
class GlobalControllerExceptionHandler {
@ResponseStatus(HttpStatus.NOT_FOUND) // 404
@ExceptionHandler(Exception.class)
public void handleNoTFound() {
// Nothing to do
}
}
并将此404响应错误映射到web.xml中,如下所示:
<error-page>
<error-code>404</error-code>
<location>/Error404.html</location>
</error-page>
希望能有所帮助。
其他回答
你可以使用@ControllerAdvice来处理异常, 默认行为@ControllerAdvice注释类将帮助所有已知的控制器。
因此,当任何控制器抛出404错误时,它将被调用。
像下面这样:
@ControllerAdvice
class GlobalControllerExceptionHandler {
@ResponseStatus(HttpStatus.NOT_FOUND) // 404
@ExceptionHandler(Exception.class)
public void handleNoTFound() {
// Nothing to do
}
}
并将此404响应错误映射到web.xml中,如下所示:
<error-page>
<error-code>404</error-code>
<location>/Error404.html</location>
</error-page>
希望能有所帮助。
从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();
}
}
}
我建议抛出HttpClientErrorException,就像这样
@RequestMapping(value = "/sample/")
public void sample() {
if (somethingIsWrong()) {
throw new HttpClientErrorException(HttpStatus.NOT_FOUND);
}
}
您必须记住,这只能在将任何内容写入servlet输出流之前进行。
简单地说,您可以使用web.xml添加错误代码和404错误页面。但是要确保404错误页面不能位于WEB-INF下面。
<error-page>
<error-code>404</error-code>
<location>/404.html</location>
</error-page>
这是最简单的方法,但也有局限性。假设您希望为该页添加与其他页相同的样式。这样你就不能那样做了。你必须使用@ResponseStatus(value = HttpStatus.NOT_FOUND)
从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注释更灵活的注释-参见另一个问题)