全局异常捕获可以使用@RestControllerAdvice注解定义捕获,如下为shiro及一些异常的捕获示例;
import com.travel.commons.vo.ServerResponseVO;
import com.travel.shiro.UnauthorizedException;
import org.apache.log4j.Logger;
import org.apache.shiro.ShiroException;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletRequest;
@RestControllerAdvice
public class ExceptionController {
private static Logger logger = Logger.getLogger(ExceptionController.class);
// 捕捉shiro的异常
@ResponseStatus(HttpStatus.UNAUTHORIZED)
@ExceptionHandler(ShiroException.class)
public ServerResponseVO handle401(ShiroException e) {
logger.error("ShiroException捕获异常" + e.getMessage());
return new ServerResponseVO(401, e.getMessage());
}
// 捕捉UnauthorizedException
@ResponseStatus(HttpStatus.UNAUTHORIZED)
@ExceptionHandler(UnauthorizedException.class)
public ServerResponseVO handle401() {
logger.error("捕获异常Unauthorized");
return new ServerResponseVO(401, "Unauthorized");
}
//捕捉其他所有异常
@ExceptionHandler(Exception.class)
@ResponseStatus(HttpStatus.BAD_REQUEST)
public ServerResponseVO globalException(HttpServletRequest request, Throwable ex) {
logger.error("捕获到异常 Exception:",ex);
return new ServerResponseVO(getStatus(request).value(), ex.getMessage());
}
private HttpStatus getStatus(HttpServletRequest request) {
Integer statusCode = (Integer) request.getAttribute("javax.servlet.error.status_code");
if (statusCode == null) {
return HttpStatus.INTERNAL_SERVER_ERROR;
}
return HttpStatus.valueOf(statusCode);
}
}