Spring REST API异常处理机制

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qiumeng_1314/article/details/82179395

@ControllerAdvice

  1. @ControllerAdvice是一个@Component,用于定义@ExceptionHandler,@InitBinder和@ModelAttribute方法,适用于所有使用@RequestMapping方法。
  2. Spring4之前,@ControllerAdvice在同一调度的Servlet中协助所有控制器。Spring4已经改变:@ControllerAdvice支持配置控制器的子集,而默认的行为仍然可以利用。
  3. 在Spring4中, @ControllerAdvice通过annotations(), basePackageClasses(), basePackages() 方法定制用于选择控制器子集。

@ExceptionHandler

可以对web的服务器端运行错误, 做统一的处理

实现方式

一.定义全局捕获异常

@ControllerAdvice
@ResponseBody
public class GlobalExceptionHandler {
    private Logger logger = LoggerFactory.getLogger(GlobalExceptionHandler.class);

    public GlobalExceptionHandler() {
    }
    //ServiceException自定义业务异常
    @ExceptionHandler({ServiceException.class})
    public BaseResult baseExceptionHandler(HttpServletResponse response, ServiceException ex) {
        this.logger.error(ex.getMessage(), ex);
        return new BaseResult(ex.getCode(), ex.getMessage());
    }

    @ExceptionHandler({Exception.class})
    public BaseResult otherExceptionHandler(HttpServletResponse response, Exception ex) {
        this.logger.error(ex.getMessage(), ex);
        return new BaseResult(ResultCode.SERVER_ERROR, ex.getMessage());
    }
}

2.定义公共异常。

public class ServiceException extends RuntimeException {
    private int code;

    public ServiceException() {
        this.code = ResultCode.ERROR;
    }

    public ServiceException(BaseExceptionMsg baseExceptionMsg) {
        this(baseExceptionMsg.getExpCode(), baseExceptionMsg.getExpMsg());
    }

    public ServiceException(int code, String message) {
        super(message);
        this.code = ResultCode.ERROR;
        this.code = code;
    }

    public ServiceException(String message, Throwable cause, int code) {
        super(message, cause);
        this.code = ResultCode.ERROR;
        this.code = code;
    }

    public ServiceException(String message) {
        super(message);
        this.code = ResultCode.ERROR;
    }

    public ServiceException(String message, Throwable cause) {
        super(message, cause);
        this.code = ResultCode.ERROR;
    }

    public ServiceException(Throwable cause) {
        super(cause);
        this.code = ResultCode.ERROR;
    }

    public int getCode() {
        return this.code;
    }

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

    String getExpMsg();
}

3.定义各个系统异常。

public enum DmaServiceExcetionMsg implements BaseExceptionMsg {

    QUERY_NODATA(20000,"查询无数据"),

    TOKENEXCEPTION(20001,"Token无效或Token已失效"),

    NOT_NULL(20002,"为必填字段"),

    TO_LONG(20003,"字段太长");

    private int code;
    private String msg;

    DmaServiceExcetionMsg(int code, String msg) {
        this.code = code;
        this.msg = msg;
    }

    public int getCode() {
        return code;
    }

    public String getMsg() {
        return msg;
    }

    @Override
    public int getExpCode() {
        return this.getCode();
    }

    @Override
    public String getExpMsg() {
        return this.getMsg();
    }
}
展开阅读全文

Rest API问题汇总

06-26

汇总了一下我使用java demo 调试REST时遇到的小问题,分享给大家,希望对大家能有帮助rnrnrnrnQ:运行java的rest demo报java 版本低?Syntax error, 'for each' statements are only available if source level is 1.5。rnA:将编译库修改为高于1.5的版本。具体为:将File->properties->java compiler->compiler compliance level 改为1.6。rnrnQ:编译报此错误:The project was not built due to "Could not delete '/ccoprestdemo/bin/com'.". Fix the problem, then try refreshing this project and building it since it may be inconsistent。rnA:因为eclipse编译文件的时候需要把之前的删掉重新编译一次,但是程序有一个class被占用,如:目录路径在dos里面是打开状态,故没法删除,所以就报这个错。rn 解决办法为:1)关掉对项目目录操作的其他应用软件;2)如果还不行,请注销操作系统。rnrnQ:Java demo包ssl验证错误?javax.net.ssl.SSLPeerUnverifiedException: peer not authenticated。rnA:java环境变量设置错误,导致Eclipse加载jdk时目录与实际路径对应错误。rn 解决方法为:1)正确配置java环境变量;2)重新加载Eclipse和jdk。rnrnQ:demo修改配置文件时拷贝主服务器地址出错:java.net.UnknownHostException: https。rnA:网站的注册信息为REST服务器地址:https://app.cloopen.com,而demo配置只需要app.cloopen.com。rn 解决办法为:将demo的配置文件中的主服务器地址修改为app.cloopen.com。rnrnQ:java demo短信内容为中文时出现乱码的问题?rnA:因为读取配置文件时默认字符集为ISO8859-1。rn 解决办法为:将配置文件保存为utf-8格式,具体字段应用时转换字符集,“String con = new String(PropertiesUtil.readValue(filePath, "content").getBytes("ISO8859-1"), "utf-8");”。rnrnQ:sig参数值生成规则需要哪些注意的?rnA:1)sig参数根据主账户或子账户进行鉴权的,在不同的接口中是不一样的。请根据具体的接口说明选择主账号或子账号。rn 2)sig参数是需要大写的!rnrnQ:请求头(Request Header)是否有限制?rnA:请求头中附加的内容需要做BASE64编码。rnrnQ:有时在主账户Id和主账户授权令牌均正确的情况下,主账户验证仍然报"20001"错误,即主账户令牌错误?rnA:有2种原因会导致该情况发生,一是Base64编码和MD5加密串中的时间戳不一致,二是MD5加密出来的字母是小写的,MD5串转换成大写即可。rnrnQ:有时请求地址、方法和Body均正确,云通讯REST服务器却报404错误,并提示"The requested resource (/WEB-INF/jsp/cloudcom.jsp) is not available."信息?rnA:请检查请求Headers中的Accept的值是不是"application/xml",Content-Type的值是不是"application/xml;charset=utf-8"。 论坛

没有更多推荐了,返回首页