NA.*_*NA. 182 java spring spring-mvc
如何让Spring 3.0控制器触发404?
我有一个控制器,@RequestMapping(value = "/**", method = RequestMethod.GET)有些URL访问控制器,我希望容器能够提供404.
axt*_*avt 312
从Spring 3.0开始,你也可以抛出一个用@ResponseStatus注释声明的异常:
@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();
}
}
}
Run Code Online (Sandbox Code Playgroud)
mat*_*t b 36
重写您的方法签名,使其HttpServletResponse作为参数接受,以便您可以调用setStatus(int)它.
mic*_*man 25
我想提一下,由Spring提供的默认值为404(不仅仅是).请参阅Spring文档了解详细信息 因此,如果您不需要自己的例外,您可以这样做:
@RequestMapping(value = "/**", method = RequestMethod.GET)
public ModelAndView show() throws NoSuchRequestHandlingMethodException {
if(something == null)
throw new NoSuchRequestHandlingMethodException("show", YourClass.class);
...
}
Run Code Online (Sandbox Code Playgroud)
Lu5*_*u55 24
从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);
}
}
Run Code Online (Sandbox Code Playgroud)
(ResponseEntity <T>比@ResponseBody注释更灵活 - 请参阅另一个问题)
小智 16
您可以使用@ControllerAdvice来处理异常,@ ControllerAdvice注释类的默认行为将协助所有已知的控制器.
所以当你有任何控制器抛出404错误时会调用它.
如下:
@ControllerAdvice
class GlobalControllerExceptionHandler {
@ResponseStatus(HttpStatus.NOT_FOUND) // 404
@ExceptionHandler(Exception.class)
public void handleNoTFound() {
// Nothing to do
}
}
Run Code Online (Sandbox Code Playgroud)
并在您的web.xml中映射此404响应错误,如下所示:
<error-page>
<error-code>404</error-code>
<location>/Error404.html</location>
</error-page>
Run Code Online (Sandbox Code Playgroud)
希望有助于.
Jon*_*oni 14
从Spring 5.0开始,您不必创建其他异常:
throw new ResponseStatusException(NOT_FOUND, "Unable to find resource");
Run Code Online (Sandbox Code Playgroud)
此外,您可以使用一个内置的例外情况涵盖多种情况,并且您拥有更多的控制权。
看更多:
Ral*_*lph 10
如果您的控制器方法适用于文件处理,那么ResponseEntity非常方便:
@Controller
public class SomeController {
@RequestMapping.....
public ResponseEntity handleCall() {
if (isFound()) {
return new ResponseEntity(...);
}
else {
return new ResponseEntity(404);
}
}
}
Run Code Online (Sandbox Code Playgroud)
小智 7
我建议像这样抛出HttpClientErrorException
@RequestMapping(value = "/sample/")
public void sample() {
if (somethingIsWrong()) {
throw new HttpClientErrorException(HttpStatus.NOT_FOUND);
}
}
Run Code Online (Sandbox Code Playgroud)
您必须记住,只有在将任何内容写入servlet输出流之前,才能执行此操作.
虽然明确的答案是正确的,但有一种方法可以实现这一点,没有例外.该服务返回Optional<T>搜索到的对象,HttpStatus.OK如果找到则映射到404,如果为空则映射到404.
@Controller
public class SomeController {
@RequestMapping.....
public ResponseEntity<Object> handleCall() {
return service.find(param).map(result -> new ResponseEntity<>(result, HttpStatus.OK))
.orElse(new ResponseEntity<>(HttpStatus.NOT_FOUND));
}
}
@Service
public class Service{
public Optional<Object> find(String param){
if(!found()){
return Optional.empty();
}
...
return Optional.of(data);
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
125130 次 |
| 最近记录: |