SpringBoot 统一拦截错误调用
我们对外提供的rest接口,是通过原本的dubbo接口来支持rest协议实现的。现在遇到一个问题,比如我某个字段定义了long,然后传了一个中文进来。在进入接口前,就报了fastjson类型转换异常了。然后就默认返回了500。我试了加aop在进入方法前拦截,结果不行。进入不到aop里边。有什么方法能把这个异常捕获到,并统一返回吗?
在Spring Boot应用中定义自定义异常处理器(Exception Handler),以捕获和处理各种异常并提供统一的错误响应。
要实现这个功能,您需要首先定义一个类来处理将抛出的异常转换为标准的错误响应。例如:
@ControllerAdvice
public class RestExceptionHandler {
@ExceptionHandler({ MethodArgumentTypeMismatchException.class })
public ResponseEntity<Object> handleMethodArgumentTypeMismatch(MethodArgumentTypeMismatchException ex, WebRequest request) {
String error = "Invalid argument: " + ex.getName() + ". Expected type " + ex.getRequiredType().getName() + ".";
RestErrorResponse apiError = new RestErrorResponse(HttpStatus.BAD_REQUEST, error);
return new ResponseEntity<Object>(apiError, new HttpHeaders(), apiError.getStatus());
}
}
在上述示例中,我们使用@ControllerAdvice注解来标识这是一个全局异常处理器类,并通过@ExceptionHandler注解来指定要处理的特定异常类型。在handleMethodArgumentTypeMismatch方法中,我们将方法参数类型不匹配的异常转换为通用的RestErrorResponse对象,并返回该对象的HTTP状态码、错误原因、错误代码等信息。
在Spring Boot应用中,当发生异常时,会自动查找适合的异常处理器类进行异常处理。如果找到了与抛出异常相匹配的异常处理器类,则调用该类中的异常处理方法来生成标准的错误响应。否则,将返回默认的500错误响应。
需要注意的是,在上述示例中,我们只处理了其中一种异常类型,您需要根据具体需求来定义适合的异常处理器类,并处理相应的异常类型。
另外,如果需要在RestController类的方法中捕获异常并返回自定义返回信息,您可以使用@ExceptionHandler注解将异常处理程序添加到特定的控制器方法中。例如:
@RestController
public class MyController {
@GetMapping("/parseLong")
public String parseLong(@RequestParam("value") Long value) {
return "Value: " + value;
}
@ExceptionHandler({ MethodArgumentTypeMismatchException.class })
public ResponseEntity<Object> handleMethodArgumentTypeMismatch(MethodArgumentTypeMismatchException ex, WebRequest request) {
String error = "Invalid argument: " + ex.getName() + ". Expected type " + ex.getRequiredType().getName() + ".";
RestErrorResponse apiError = new RestErrorResponse(HttpStatus.BAD_REQUEST, error);
return new ResponseEntity<Object>(apiError, new HttpHeaders(), apiError.getStatus());
}
}
在上述示例中,我们使用@GetMapping注解定义一个接受Long类型参数的RESTful API,并通过@ExceptionHandler注解将异常处理程序添加到方法中。这样,在发生方法参数类型不匹配的异常时,会调用handleMethodArgumentTypeMismatch方法来生成标准的错误响应。