@RestControllerAdvice注解使⽤
在spring 3.2中,新增了@ControllerAdvice,@RestControllerAdvice 注解,可以⽤于定义@ExceptionHandler、@InitBinder、
@ModelAttribute,并应⽤到所有@RequestMapping中。参考。@RestControllerAdvice 是组件注解,他使得其实现类能够被classpath扫描⾃动发现,如果应⽤是通过MVC命令空间或MVC Java编程⽅式配置,那么该特性默认是⾃动开启的。
主要配合@ExceptionHandler使⽤,统⼀处理异常情况。下⾯的ResponseEntity、ResponseData 都是项⽬⾃定义的返回对象。
slf4j.Slf4j;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import org.springframework.web.servlet.NoHandlerFoundException;
@Slf4j
@RestControllerAdvice
public class GlobalExceptionHandler {
/**
* 处理运⾏异常
*/
springcloud和springboot@ExceptionHandler(RuntimeException.class)
public ResponseEntity<String> handleRuntimeException(HttpServletRequest request, RuntimeException ex) {
<("", ex);
<("请求地址:" + RequestURL());
<("请求参数: " + ParameterMap()));
return new ResponseEntity<>(ex.getMessage(), HttpStatus.BAD_REQUEST);
}
/**
* ⽤来捕获404,400这种⽆法到达controller的错误
*
* @param ex
* @return
* @throws Exception
*/
@ExceptionHandler(value = Exception.class)
public ResponseData defaultErrorHandler(Exception ex) throws Exception {
<("", ex);
ResponseData<Object> result = new ResponseData<Object>();
result.Message());
if (ex instanceof NoHandlerFoundException) {
result.setCode("404");
} else {
result.setCode("500");
}
result.setData(null);
result.setSuccess(false);
return result;
}
}
补充:同时定义2套ExceptionHandler
需求:原项⽬是根据⼀个SpringBoot开源项⽬改造来的,返回对象只满⾜前端使⽤,后来改成SpringCloud项⽬后,项⽬使⽤Feign相互调⽤时,再⽤原来那套返回对象就不好⽤了,只能接收到⼀个Http状态码,描述信息都收不到。因为之前已经有⼀个全局的GlobalExceptionHandler了,所以要在做⼀个套给Feign使⽤的ExceptionHandler,换个更适合的返回对象。
代码如下:
@RestControllerAdvice(basePackageClasses = {com.ller.ApiController.class})
@Order(Ordered.HIGHEST_PRECEDENCE)
public class ApiExceptionHandler {
}
@RestControllerAdvice注解使⽤了basePackageClasses指定了为Feign提供接⼝的ApiController类,说明此ExceptionHandler只作⽤到这个Controller,对其他⽆效。
@Order(Ordered.HIGHEST_PRECEDENCE) 顺序注解,要提⾼此ExceptionHandler的执⾏顺序,必须在全局的GlobalExceptionHandler之前执⾏,如果此ExceptionHandler定义的异常未拦截成功,在⾛GlobalExceptionHandler
@RestControllerAdvice
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论