异常处理
目前暂时只列举:
ExceptionHandler
:控制器的异常处理ResponseStatus
异常设置异常状态处理AbstractErrorController
:继承抽象异常控制器处理全局异常
ExceptionHandler使用
@RestControllerAdvice
public class ExceptionController {
@ExceptionHandler(ArithmeticException.class)
public String handlerException(Exception e) {
e.printStackTrace();
return "Integer类型转换异常";
}
@ExceptionHandler(NullPointerException.class)
@ResponseStatus(value = HttpStatus.FORBIDDEN)
public String nullException(Exception e) {
return "空指针异常";
}
}
注意事项
:ExceptionHandler
是处理控制器中的异常的,包括拦截器中的异常
ResponseStatus使用
ResponseStatus
是设置响应状态和信息的
可以注解在:
- 响应方法上,比如
RequestMapping
方法和RestControllerAdvice
类上或者方法上 - 异常类上
@ResponseStatus(value = HttpStatus.FORBIDDEN, reason = "用户名密码不匹配")
public class NoMatchException extends RuntimeException {
}
@ExceptionHandler(NullPointerException.class)
@ResponseStatus(value = HttpStatus.FORBIDDEN)
public String nullException(Exception e) {
return "空指针异常";
}
AbstractErrorController全局异常处理
ContollerAdvice只能拦截控制器中的异常,换言之,只能拦截500之类的异常,但是对于404这样不会进入控制器处理的异常不起作用。
/**
* Error controller.
*
* @author xiao7
*/
@RestController
@ConditionalOnWebApplication
@RequestMapping("${server.error.path:${error.path:/error}}")
public class ErrorController extends AbstractErrorController {
private static final String SPECIAL_ERROR_FLAG = "org.springframework.boot.web.servlet.error.DefaultErrorAttributes.ERROR";
@Value("${error.path:/error}")
private String errorPath;
/**
* Instantiates a new Error controller.
*
* @param errorAttributes the error attributes
*/
public ErrorController(ErrorAttributes errorAttributes) {
super(errorAttributes);
}
/**
* Error object.
*
* @param request the request
* @return the object
*/
@RequestMapping
@ResponseBody
public Object error(HttpServletRequest request) {
Object specialError = request.getAttribute(SPECIAL_ERROR_FLAG);
if (specialError instanceof NoMatchException) {
System.out.println("自定义的密码不匹配异常");
return "自定义的密码不匹配异常";
}
Map<String, Object> error = getErrorAttributes(request, true);
int httpCode = (int) error.getOrDefault("status", -1);
String message = error.getOrDefault("message", "").toString();
String exMsg = (String) error.getOrDefault("error", "");
Map<String, Object> result = new HashMap<>();
result.put("code", httpCode);
result.put("msg", message);
return result;
}
/**
* Method validation post processor method validation post processor.
*
* @return the method validation post processor
*/
@Bean
public MethodValidationPostProcessor methodValidationPostProcessor() {
return new MethodValidationPostProcessor();
}
@Override
public String getErrorPath() {
return errorPath;
}
}
至于运行结果,请自行运行~~~~
注意事项:在实际使用中往往需要多种异常处理互相搭配只用才能达到预期的效果。