java - 为找不到资源创建自定义异常 404 SPRING BOOT
问题描述
我确实有一个类CustomResponseEntityExceptionHandler
类扩展ResponseEntityExceptionHandler
了 2 种方法,一种用于处理错误格式,另一种用于请求资源(url)但不存在时。我想给用户一个自定义消息,而不是 Spring 的默认白标错误页面。我试图理解为什么在请求不存在的 URI 时不调用我的handleResourceNotFoundException
方法,CustomResponseEntityExceptionHandler
但我一直有白标错误页面。谢谢你的帮助!
curl localhost:8080/doesnotexist
这是我的CustomResponseEntityExceptionHandler
@ExceptionHandler(Exception.class)
public final ResponseEntity<ErrorDetails> handleAllWrongFormatExceptions(WrongFormatException ex,
WebRequest request) {
ErrorDetails errorDetails = new ErrorDetails(new Date(), ex.getMessage(), request.getDescription(true));
return new ResponseEntity<>(errorDetails, HttpStatus.INTERNAL_SERVER_ERROR);
}
@ExceptionHandler(ResourceNotFoundException.class)
public final ResponseEntity<ErrorDetails> handleResourceNotFoundException(ResourceNotFoundException ex,
WebRequest request) {
ErrorDetails errorDetails = new ErrorDetails(new Date(), ex.getMessage(), request.getDescription(false));
return new ResponseEntity<>(errorDetails, HttpStatus.NOT_FOUND);
}
用于保存自定义错误详细信息的简单类
public class ErrorDetails {
private Date timestamp;
private String message;
private String details;
public ErrorDetails(Date timestamp, String message, String details) {
this.timestamp = timestamp;
this.message = message;
this.details = details;
}
public Date getTimestamp() {
return timestamp;
}
public String getMessage() {
return message;
}
public String getDetails() {
return details;
} }
这是我的控制器
@Controller
public class StringManipController {
@Autowired
private StringProcessingService stringProcessingService;
@GetMapping("/")
@ExceptionHandler(ResourceNotFoundException.class)
@ResponseBody
public String home(@RequestParam(name = "value", required = false, defaultValue = "") String value) {
return "Welcome to the String Processing Application";
}
@GetMapping("/stringDedup")
@ResponseBody
public ProcessedString doManip(@RequestParam(name = "value", required = false, defaultValue = "") String value) {
String result = stringProcessingService.getStringManipulation(value);
return new ProcessedString(result);
}
@GetMapping("/writeNumber")
@ResponseBody
public ProcessedString getWriteNumber(
@RequestParam(name = "value", required = false, defaultValue = "") String value) {
String number = stringProcessingService.getNumberToWords(value);
return new ProcessedString(number);
} }
在这里ResourceNotFoundException class
@ResponseStatus(HttpStatus.NOT_FOUND)
public class ResourceNotFoundException extends RuntimeException {
private static final long serialVersionUID = 266853955330077478L;
public ResourceNotFoundException(String exception) {
super(exception);
} }
解决方案
如果您使用 Spring Boot:
@ControllerAdvice
public class CustomResponseEntityExceptionHandler {
@ExceptionHandler(value = { NoHandlerFoundException.class })
public ResponseEntity<Object> noHandlerFoundException(Exception ex) {
return ResponseEntity.status(HttpStatus.BAD_REQUEST).body("test");
}
}
或者
@ControllerAdvice
public class CustomResponseEntityExceptionHandler extends ResponseEntityExceptionHandler {
@Override
protected ResponseEntity<Object> handleNoHandlerFoundException(
NoHandlerFoundException ex, HttpHeaders headers, HttpStatus status, WebRequest request) {
return handleExceptionInternal(ex, "Test", headers, status, request);
}
}
在org.springframework.web.servlet.DispatcherServlet
类中有一个名为 的变量throwExceptionIfNoHandlerFound
。如果将其设置为true
调用的方法,noHandlerFound
则会抛出NoHandlerFoundException
. 您的异常处理程序现在将捕获它。
将此属性添加到您的application.properties
文件中:spring.mvc.throw-exception-if-no-handler-found=true
推荐阅读
- slack - Slack Api:是否可以更新其他用户的消息?
- sql-server - 删除多个动态透视结果中的空值
- python - 我想知道一个国家的首都只介绍一个国家
- excel - VBA删除相互抵消的行
- javascript - mui-datatables:警告:不能给函数组件提供参考。尝试访问此 ref 将失败。你的意思是使用 React.forwardRef() 吗?
- python - 如何设置我的 Python 路径以便 pytest 能够找到我的 Django 'manage.py' 文件?
- python - 优化代码以打印嵌套字典中的排序项
- mysql - 比较值,对它们进行排序并确定哪个更有利
- javascript - 来自数组的 Angular 生成减速器
- bittorrent - 如何设置bittorrent的DHT服务器?