1、创建 MyRestControllerAdvice 类,并添加 @RestControllerAdvice
import com.tm.common.dto.Rjson;
import com.tm.common.exception.BusinessException;
import lombok.extern.slf4j.Slf4j;
import org.apache.shiro.authz.AuthorizationException;
import org.springframework.dao.DataAccessException;
import org.springframework.http.converter.HttpMessageConversionException;
import org.springframework.web.HttpRequestMethodNotSupportedException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
/**
* 增强器
* 还有一个 @ControllerAdvice,
* 他们的区别类似于:@RestController 与 @Controller的区别
* 如果用:@ControllerAdvice,那么以下发方法,就要加 @ResponseBody 返回数据
* @author tomao2014@qq.com
* @date 2018/5/22 21:09
*/
@Slf4j
@RestControllerAdvice
public class MyRestControllerAdvice {
@ExceptionHandler(RuntimeException.class)
public Rjson handleRuntimeException(RuntimeException e){
// http请求异常
if (e instanceof HttpMessageConversionException){
log.error("【Bad Request】",e.getMessage(),e);
return Rjson.error("Bad Request");
}
if (e instanceof AuthorizationException){
log.error("【无操作权限Shiro】",e.getMessage(),e);
return Rjson.error(Rjson.CODE_1403,"未授权:操作失败,请联系管理员授权");
}
if (e instanceof BusinessException){
log.error("【业务异常】",e.getMessage(),e);
return Rjson.error(e.getMessage());
}
if (e instanceof DataAccessException){
log.error("【数据库异常:spring-dao】",e.getMessage(),e);
return Rjson.error("DB异常,请联系管理员");
}
log.error("【其他RuntimeException】",e.getMessage(),e);
return Rjson.error();
}
/** 全局异常捕捉处理 */
@ExceptionHandler(Exception.class)
public Rjson handleException(Exception e){
if (e instanceof HttpRequestMethodNotSupportedException){
return Rjson.error("不支持的请求方式/"+e.getMessage());
}
log.error("【未知异常】:"+e.getMessage(), e);
return Rjson.error();
}
}
2、创建通用,统一的的返回对象
import java.io.Serializable;
/**
* 通用的返回对象
* @author tomao2014@qq.com
* @date 2018/4/13 14:08
*/
public class Rjson implements Serializable{
/**
* ajax响应编码,200 表示正常请求,不存在非授权或者未登录请求
*/
public static final int CODE_DEF = 200;
/**
* 未登录,前端判断后,跳转到登录页面
*/
public static final int CODE_1100 = 1100;
/**
* 无权访问
*/
public static final int CODE_1403 = 1403;
private Integer code = CODE_DEF;
private Boolean success = false;
private String msg;
private Object obj;
public Integer getCode() {
return code;
}
public void setCode(Integer code) {
this.code = code;
}
public Boolean getSuccess() {
return success;
}
public void setSuccess(Boolean success) {
this.success = success;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public Object getObj() {
return obj;
}
public void setObj(Object obj) {
this.obj = obj;
}
public static Rjson error(){
Rjson r = new Rjson();
r.setMsg("系统异常,请稍后重试");
return r;
}
public static Rjson error(String msg){
Rjson r = new Rjson();
r.setMsg(msg == null ? "系统异常,请稍后重试" : msg);
return r;
}
public static Rjson error(int code,String msg){
Rjson r = new Rjson();
r.setCode(code);
r.setMsg(msg == null ? "系统异常,请稍后重试" : msg);
return r;
}
public static Rjson ok() {
Rjson r = new Rjson();
r.setSuccess(true);
return r;
}
public static Rjson ok(String msg) {
Rjson r = new Rjson();
r.setSuccess(true);
r.setMsg(msg);
return r;
}
public static Rjson ok(Object obj) {
Rjson r = new Rjson();
r.setSuccess(true);
r.setObj(obj);
return r;
}
public static Rjson ok(Object obj,String msg) {
Rjson r = new Rjson();
r.setSuccess(true);
r.setObj(obj);
r.setMsg(msg);
return r;
}
}
3、添加完上面的配置之后,我们在controller类中,可以不添加 try...catch... 模块了。
如果出现异常,那么会进入 MyRestControllerAdvice 处理,并返回对应的错误信息。前端页面不会看到
后台直接抛出的异常信息。
import com.baomidou.mybatisplus.mapper.Condition;
import com.tm.auth.entity.SysUser;
import com.tm.auth.service.SysUserService;
import com.tm.common.controller.BaseController;
import com.tm.common.dto.Rjson;
import com.tm.common.validator.ValidatorUtils;
import com.tm.common.validator.group.AddGroup;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
/**
* <p>
* 用户管理
* </p>
*
* @author tomao2014qq.com
* @since 2018-05-18
*/
@Slf4j
@RestController
@RequestMapping("/sys/user")
public class SysUserController extends BaseController {
@Autowired
private SysUserService sysUserService;
@PostMapping("/add")
public Rjson add(@RequestBody SysUser user){
ValidatorUtils.validateEntity(user,AddGroup.class);
sysUserService.add(user);
return Rjson.ok();
}
}
如果在controller类中添加了 try...catch... 如果处理过程中,出现异常,那么返回的是 controller
中我们指定catch中的信息。
@PostMapping("/add")
public Rjson add(@RequestBody SysUser user){
try {
ValidatorUtils.validateEntity(user,AddGroup.class);
sysUserService.add(user);
}catch (Exception e){
return Rjson.error("返回的异常信息,是我!");
}
return Rjson.ok();
}
参考资料:
https://www.cnblogs.com/magicalSam/p/7198420.html
https://www.cnblogs.com/nosqlcoco/p/5562107.html
https://blog.csdn.net/flygoa/article/details/75284755