一、页面的形式返回

   直接在resources的目录下创建public/error的路径,然后创建5xx.html或者4xx.html文件,如果出错就会自动跳转的相应的页面。

二、cotroller的形式返回错误的处理

    1.自定义错误处理类

    

package com.kiyozawa.manager.error;
import org.springframework.boot.autoconfigure.web.ErrorProperties;
import org.springframework.boot.autoconfigure.web.*;
import org.springframework.web.context.request.RequestAttributes;
import org.springframework.web.context.request.ServletRequestAttributes;

import javax.servlet.http.HttpServletRequest;
import java.util.List;
import java.util.Map;

/**
 * 自定义错误处理
 */
public class MyErrorController extends BasicErrorController {

    public MyErrorController(ErrorAttributes errorAttributes, ErrorProperties errorProperties, List<ErrorViewResolver> errorViewResolvers) {
        super(errorAttributes, errorProperties, errorViewResolvers);
    }

//        {
//            "timestamp": "2019-03-02 13:19:46.066",
//               x "status": 500,
//                x"error": "Internal Server Error",
//               x "exception": "java.lang.IllegalArgumentException",
//                "message": "编号不可为空",
//               x "path": "/manager/products"
//        }


    @Override
    protected Map<String, Object> getErrorAttributes(HttpServletRequest request, boolean includeStackTrace) {
        Map<String, Object> attrs = super.getErrorAttributes(request, includeStackTrace);
       //去除返回值中不必要的信息
        attrs.remove("timestamp");
        attrs.remove("status");
        attrs.remove("error");
        attrs.remove("exception");
        attrs.remove("path");
        //通过信息获取errorCode的值,最终获取errorEnum类的信息
        String errorCode = (String) attrs.get("message");
        ErrorEnum errorEnum = ErrorEnum.getByCode(errorCode);
        //ErrorEnum类的信息存入attrs中返回给前端
        attrs.put("message",errorEnum.getMessage());
        attrs.put("code",errorEnum.getCode());
        attrs.put("canRetry",errorEnum.isCanRetry());
        return attrs;
    }
}

把错误处理类自动配置到Springboot中

package com.kiyozawa.manager.error;

import org.springframework.beans.factory.ObjectProvider;
import org.springframework.boot.autoconfigure.web.ErrorAttributes;
import org.springframework.boot.autoconfigure.web.ErrorViewResolver;
import org.springframework.boot.autoconfigure.web.ServerProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.List;

@Configuration
public class ErrorConfiguration {
    @Bean
    public MyErrorController basicErrorController(ErrorAttributes errorAttributes, ServerProperties serverProperties,
                                                  ObjectProvider<List<ErrorViewResolver>> errorViewResolversProvider) {
        return new MyErrorController(errorAttributes, serverProperties.getError(),
                errorViewResolversProvider.getIfAvailable());
    }
}

自定义错误类型

package com.kiyozawa.manager.error;

public enum ErrorEnum {
    ID_NoT_NULL("F001","编码不为空",false),
    UNKOWN("000","位置异常",false);
    private String code;
    private String message;
    private boolean canRetry;
    ErrorEnum(String code,String message,boolean canRetry){
        this.code=code;
        this.message=message;
        this.canRetry=canRetry;
    }
    public static ErrorEnum getByCode(String code){
        for (ErrorEnum errorEnum:ErrorEnum.values()){
            if(errorEnum.code.equals(code)){
                return errorEnum;
            }
        }
        return UNKOWN;

    }

    public String getCode() {
        return code;
    }

    public String getMessage() {
        return message;
    }

    public boolean isCanRetry() {
        return canRetry;
    }
}

另外的一种方式见下:

package com.kiyozawa.manager.error;

import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.util.Assert;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;

import java.util.HashMap;
import java.util.Map;

/**
 * 统一错误处理
 */
//路径为controller类的路径
@ControllerAdvice(basePackages = {"com.kiyozawa.manager.controller"}) public class ErrorControllerAdvice { @ExceptionHandler(Exception.class) @ResponseBody public ResponseEntity handleException(Exception e){ Map<String, Object> attrs = new HashMap(); String errorCode = e.getMessage(); ErrorEnum errorEnum = ErrorEnum.getByCode(errorCode); attrs.put("message",errorEnum.getMessage()); attrs.put("code",errorEnum.getCode()); attrs.put("canRetry",errorEnum.isCanRetry()); attrs.put("type","advice"); // Assert.isNull(attrs,"advice"); return new ResponseEntity(attrs, HttpStatus.INTERNAL_SERVER_ERROR); } }