Skip to content

异常信息填充Response以及断言增强

版本要求>=3.3.0

异常信息填充Response

部分用户希望在抛异常时,直接将异常信息作为响应的错误提示。如以下伪代码。

java

public class Service {
    public void command() {
        throw new RuntimeException("希望返回这里的信息作为错误提示");
    }
}

在3.3.0以前,如果异常没有被@ExceptionMapper修饰,将会直接返回默认的错误提示 例如以下配置,响应中的msg将被设置为fail

yaml
graceful-response:
  default-error-msg: fail

3.3.0版本开始,提供graceful-response.origin-exception-using-detail-message 配置,用于配置是否从异常信息中抽取其detailMessage作为响应提示。

配置graceful-response.origin-exception-using-detail-message后,

yaml

graceful-response:
  origin-exception-using-detail-message: true

上面的异常将返回异常的detailMessage作为提示,例如:

json
{
  "code": "1",
  "msg": "希望返回这里的信息作为错误提示",
  "data": {}
}

注意! 注意! 注意!

origin-exception-using-detail-message如果被配置为true,则全局的原生异常都会按照同样的逻辑进行处理,有可能某些异常信息并不是我们预期的,如下图,请开发者自行评估影响。

picD8Fx.png

断言增强

在日常开发中我们经常使用断言来验证数据的准确性,例如:

java
Assert.isTrue(id==1,"id不等于1");

由于断言的底层也是使用异常,如果origin-exception-using-detail-message被设置true,我们可以直接拿到message进行返回。

java
public static void isTrue(boolean expression,String message){
    if(!expression){
        throw new IllegalArgumentException(message);
    }
}

origin-exception-using-detail-message被设置false的情况下,我们可以使用GracefulResponse.wrapAssert()完成对断言的增强。

  • 不需要指定错误码
java
@RequestMapping("/assert1")
@ResponseBody
public void assert1(Integer id){
    GracefulResponse.wrapAssert(()->Assert.isTrue(id==1,"id不等于1"));
}

此时,Response的msg将被设置为断言的message,即上面的id不等于1

  • 指定错误码
java
@RequestMapping("/assert2")
@ResponseBody
public void assert2(Integer id){
    GracefulResponse.wrapAssert("1001",()->Assert.isTrue(id==1,"id不等于1"));
}

此时,Response的code为1001,msg为id不等于1