(办公)springboot配置全局异常

   项目用到了springboot,本来很高兴,但是项目里什么东西都没有,验证,全局异常这些都需要自己区配置。最近springboot用的还是蛮多的,我还是做事情,把经验发表一下.全局统一的异常,首先异常的返回值和正常返回的返回值应该统一json.返回值的code和msg可以用enum保存起来,controller层的方法抛出异常.下面看代码.

      

package com.lianrong.system.controller;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.http.HttpStatus;
import org.springframework.http.converter.HttpMessageNotReadableException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.ResponseStatus;

import com.lianrong.system.constants.MessageConstant;
import com.lianrong.system.base.SimpleServiceResult;
import com.lianrong.system.exception.ServiceException;

@ControllerAdvice
public class AdviceController {
    private static final Logger logger = LoggerFactory.getLogger(AdviceController.class);

    @ExceptionHandler(ServiceException.class)
    @ResponseBody
    public SimpleServiceResult handlerException(ServiceException e) {
        logger.warn("预知异常", e);
        //SimpleServiceResult jsonResult = new SimpleServiceResult();
        //jsonResult.setStatus(false);
        //jsonResult.addMsg(MessageConstant.E0000_9999, e.getMessage());
        return SimpleServiceResult.error500(e.getMessage());
    }

    @ExceptionHandler(HttpMessageNotReadableException.class)
    @ResponseBody
    @ResponseStatus(value= HttpStatus.BAD_REQUEST)
    public SimpleServiceResult handlerException(HttpMessageNotReadableException e) {
        logger.error("服务器未能理解请求!", e);
        //SimpleServiceResult jsonResult = new SimpleServiceResult();
        //jsonResult.setStatus(false);
        //jsonResult.addMsg(MessageConstant.E0000_0502, "服务器未能理解请求!");
        return SimpleServiceResult.error500("服务器未能理解请求!");
    }

    @ExceptionHandler(Exception.class)
    @ResponseBody
    public SimpleServiceResult handlerException(Exception e) {
        logger.error("运行时异常", e);
        //SimpleServiceResult jsonResult = new SimpleServiceResult();
        //jsonResult.setStatus(false);
        //jsonResult.addMsg(MessageConstant.E0000_9999, "运行时异常");
        return SimpleServiceResult.error500("运行时异常");
    }
}
package com.lianrong.system.exception;

public class ServiceException extends  RuntimeException {

    private static final long serialVersionUID = 1L;

    public ServiceException(String message) {
        super(message);
    }
}
package com.imooc.shoptest001.handle;

import com.imooc.shoptest001.utils.JsonData;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;

/**
 * 全局异常捕获
 */
@ControllerAdvice
public class ExceptionHandle {

    /**
     * ExceptionHandler 捕获什么异常
     * ResponseBody 返回json格式
     * @return
     */
    @ExceptionHandler(value = Exception.class)
    @ResponseBody
    public JsonData handle(Exception ex){
        ex.printStackTrace();
        System.out.println(ex.toString());
        return JsonData.error500(ex.getMessage());
    }
}

      

package com.imooc.shoptest001.utils;

public enum JsonDataEnum {
    ERROR(-1,"失败"),
    SUCCESS(0,"成功"),
    ;
    private Integer code;

    private String msg;

    JsonDataEnum(Integer code,String msg){
        this.code = code;
        this.msg = msg;
    }

    public Integer getCode() {
        return code;
    }

    public String getMsg() {
        return msg;
    }
}
package com.imooc.shoptest001.utils;

/**
 * 前台返回json类
 */
public class JsonData<T> {
    /**
     * 返回状态
     */
    private boolean status;
    /**
     * 错误码/正确码
     */
    private Integer code;
    /**
     * 消息.
     */
    private String msg;
    /**
     * 具体的内容.
     */
    private T data;

    public static JsonData success(String msg,Object data){
        JsonData jsonData = new JsonData();
        jsonData.setMsg(msg);
        jsonData.setStatus(true);
        jsonData.setCode(200);
        jsonData.setData(data);
        return jsonData;
    }

    public static JsonData ok(){
        JsonData jsonData = new JsonData();
        jsonData.setStatus(true);
        jsonData.setCode(200);
        return jsonData;
    }

    public static JsonData error(Integer code,String msg){
        JsonData jsonData = new JsonData();
        jsonData.setStatus(false);
        jsonData.setCode(code);
        jsonData.setMsg(msg);
        return jsonData;
    }

    public static JsonData error500(String msg){
        JsonData jsonData = new JsonData();
        jsonData.setStatus(false);
        jsonData.setCode(500);
        jsonData.setMsg(msg);
        return jsonData;
    }



    public boolean isStatus() {
        return status;
    }

    public void setStatus(boolean status) {
        this.status = status;
    }

    public Integer getCode() {
        return code;
    }

    public void setCode(Integer code) {
        this.code = code;
    }

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }

    public T getData() {
        return data;
    }

    public void setData(T data) {
        this.data = data;
    }
}

      另外自己写了一个jsonData返回类

package com.lianrong.system.base;

import java.io.Serializable;
import java.util.HashMap;
import java.util.Map;

/**
 * 返回json的工具类.
 */
public class JsonData implements Serializable {

    private static final long serialVersionUID = -1140504575505840707L;
    /**
     * 请求结果正不正常.
     */
    private boolean status;
    /**
     * 消息.
     */
    private String msg;
    /**
     * 返回码
     */
    private int code;
    /**
     * 数据:
     */
    private Object data;

    public JsonData(boolean status){
        this.status = status;
    }

    public JsonData(boolean status,int code){
        this.status = status;
    }

    public static JsonData success(Object object,String msg){
        JsonData jsondata = new JsonData(true);
        jsondata.data = object;
        jsondata.code = 200;
        jsondata.msg = msg;
        return jsondata;
    }

    public static JsonData success(Object object){
        JsonData jsondata = new JsonData(true);
        jsondata.data = object;
        jsondata.code = 200;
        return jsondata;
    }

    public static JsonData success(){
        return new JsonData(true,200);
    }


    public static JsonData error(String msg){
        JsonData jsondata = new JsonData(false);
        jsondata.msg = msg;
        return jsondata;
    }

    public static JsonData error500(String msg){
        JsonData jsondata = new JsonData(false);
        jsondata.code = 500;
        jsondata.msg = msg+",请求未完成。服务器遇到不可预知的情况。";
        return jsondata;
    }

    public static JsonData error501(String msg){
        JsonData jsondata = new JsonData(false);
        jsondata.code = 501;
        jsondata.msg = msg+",请求未完成。服务器不支持所请求的功能。";
        return jsondata;
    }

    public static JsonData error502(String msg){
        JsonData jsondata = new JsonData(false);
        jsondata.code = 502;
        jsondata.msg = msg+",请求未完成。服务器从上游服务器收到一个无效的响应。";
        return jsondata;
    }

    public static JsonData error503(String msg){
        JsonData jsondata = new JsonData(false);
        jsondata.code = 503;
        jsondata.msg = msg+",请求未完成。服务器临时过载或当机。";
        return jsondata;
    }


    public static JsonData error504(String msg){
        JsonData jsondata = new JsonData(false);
        jsondata.code = 504;
        jsondata.msg = msg+",网关超时。";
        return jsondata;
    }


    public static JsonData error401(String msg){
        JsonData jsondata = new JsonData(false);
        jsondata.code = 401;
        jsondata.msg = msg+",被请求的页面需要用户名和密码。";
        return jsondata;
    }

    public static JsonData error402(String msg){
        JsonData jsondata = new JsonData(false);
        jsondata.code = 402;
        jsondata.msg = msg+",此代码尚无法使用。";
        return jsondata;
    }

    public static JsonData error403(String msg){
        JsonData jsondata = new JsonData(false);
        jsondata.code = 403;
        jsondata.msg = msg+",对被请求页面的访问被禁止。";
        return jsondata;
    }

    public static JsonData error404(String msg){
        JsonData jsondata = new JsonData(false);
        jsondata.code = 404;
        jsondata.msg = msg+",服务器无法找到被请求的页面。";
        return jsondata;
    }

    public static JsonData error406(String msg){
        JsonData jsondata = new JsonData(false);
        jsondata.code = 406;
        jsondata.msg = msg+",服务器生成的响应无法被客户端所接受。";
        return jsondata;
    }

    public static JsonData error505(String msg){
        JsonData jsondata = new JsonData(false);
        jsondata.code = 505;
        jsondata.msg = msg+",服务器不支持请求中指明的HTTP协议版本。";
        return jsondata;
    }



    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }

    public Object getData() {
        return data;
    }

    public void setData(Object data) {
        this.data = data;
    }

    public boolean isStatus() {
        return status;
    }

    public void setStatus(boolean status) {
        this.status = status;
    }

    public int getCode() {
        return code;
    }

    public void setCode(int code) {
        this.code = code;
    }

    public Map<String,Object> toMap(){
        HashMap<String,Object> result = new HashMap<String,Object>();
        result.put("status",status);
        result.put("msg",msg);
        result.put("code",code);
        result.put("data",data);
        return result;
    }

}
原文地址:https://www.cnblogs.com/historylyt/p/10588658.html