• 重写定义Spring Boot FeignClient 捕获异常信息


    FeignClient 默认的解析器:

    public static FeignException errorStatus(String methodKey, Response response) {
    // 这里做了处理
    String message = format("status %s reading %s", response.status(), methodKey);
    try {
    if (response.body() != null) {
    String body = Util.toString(response.body().asReader());
    message += "; content:\n" + body;
    }
    } catch (IOException ignored) { // NOPMD
    }
    return new FeignException(response.status(), message);
    }
    默认截获的异常如下:

    {
    "timestamp": "2019-02-24 17:15:19",
    "status": 500,
    "error": "Internal Server Error",
    "message": "status 400 reading PaymentInterface#methodName(ParamType,ParamType)
    content: {"type":"http://httpstatus.es/404","title":"未找到资源","status":400,"detail":"这里是详细的异常信息"} ",
    "path": "/oauth/token"
    }
    自定义解析器:

    @Configuration
    public class FeignErrorDecoder implements ErrorDecoder {

    @Override
    public Exception decode(String methodKey, Response response) {
    try {
    // 这里直接拿到我们抛出的异常信息
    String message = Util.toString(response.body().asReader());
    try {
    JSONObject jsonObject = new JSONObject(message);
    return new BaseException(jsonObject.getString("message"),jsonObject.getInt("status"));
    } catch (JSONException e) {
    e.printStackTrace();
    }

    } catch (IOException ignored) {
    }
    return decode(methodKey, response);
    }
    }
    其中 BaseException类如:

    public class BaseException extends RuntimeException {
    private int status ;

    public int getStatus() {
    return status;
    }

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

    public BaseException() {
    }

    public BaseException(String message, int status) {
    super(message);
    this.status = status;
    }

    public BaseException(String message) {
    super(message);
    }

    public BaseException(String message, Throwable cause) {
    super(message, cause);
    }

    public BaseException(Throwable cause) {
    super(cause);
    }

    public BaseException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {
    super(message, cause, enableSuppression, writableStackTrace);
    }
    }
    异常格式:

    {
    "timestamp": "2019-02-24 17:15:19",
    "status": 500,
    "error": "Internal Server Error",
    "message": "用户不存在",
    "path": "/oauth/token"
    }


    转载于:https://blog.51cto.com/4925054/2354156

  • 相关阅读:
    《CMake实践》笔记二:INSTALL/CMAKE_INSTALL_PREFIX
    《CMake实践》笔记一:PROJECT/MESSAGE/ADD_EXECUTABLE
    《CMake实践》第三部分的示例代码的错误
    利用 autoconf 和 automake 生成 Makefile 文件
    如何安装 罗技“优联技术”无线鼠标、无线键盘?
    make 和 makefile 的关系
    编译器 cc、gcc、g++、CC 的区别
    如何撤销 PhpStorm/Clion 等 JetBrains 产品的 “Mark as Plain Text” 操作 ?
    Linux/Ubuntu tree 命令以树形结构显示文件夹目录结构
    C/C++ 静态链接库(.a) 与 动态链接库(.so)
  • 原文地址:https://www.cnblogs.com/javalinux/p/14365203.html
Copyright © 2020-2023  润新知