当前位置: 首页 > 知识库问答 >
问题:

Webclient ExchangeFilter不返回已定义的自定义异常类

阴凯歌
2023-03-14

当我执行一个web客户端请求(到一个外部api)并且响应是4xx或5xx代码时,我遇到了一个问题。建议处理该响应并使用自定义类检索响应

Web客户端配置是

    return WebClient.builder()
                    .baseUrl(baseUrl)
                    .defaultHeaders(httpHeaders -> {
                        httpHeaders.setBearerAuth("token");
                        httpHeaders.add(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE);
                    })
                    .filter(handlingFilter())
                    .build();
    
    
    }

处理过滤器.class

private static ExchangeFilterFunction handlingFilter() {
    return ExchangeFilterFunction.ofResponseProcessor(clientResponse -> {
        if(clientResponse.statusCode()!=null && (clientResponse.statusCode().is5xxServerError() || clientResponse.statusCode().is4xxClientError()) ) {
            return Mono.error(new MyException(clientResponse.statusCode().value(), clientResponse.statusCode().getReasonPhrase()));
        }else {
            return Mono.just(clientResponse);
        }
    });
}

MyExpcetion.class

public class MyException extends Exception{

    private int code;

    private String message;

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

但是我的客户回复总是给我一个默认格式

{
  "timestamp": "x",
  "path": "x",
  "status": "x",
  "error": "x",
  "message": "x",
  "requestId": "x",
}

代替

{
  "code": "x",
  "message": "x"
}

怎么了?谢谢

共有1个答案

池砚文
2023-03-14

要更改客户端的响应(endpoint的响应),必须正确处理异常。查看有关管理异常的Spring文档

恢复:如果您使用注释endpoint,则必须在控制器类或@一来控制程序建议中创建@ExceptionHandler(MyException.class)

如果您使用的是功能endpoint,请配置WebExceptionHandler

 类似资料:
  • 如果 Java 提供的内置异常类型不能满足程序设计的需求,这时我们可以自己设计 Java 类库或框架,其中包括异常类型。实现自定义异常类需要继承 Exception 类或其子类,如果自定义运行时异常类需继承 RuntimeException 类或其子类。 自定义异常的语法形式为: 在编码规范上,一般将自定义异常类的类名命名为 XXXException,其中 XXX 用来代表该异常的作用。 自定义异

  • 改变json输出策略 默认使用阿里的fastjson进行json输出 JSON.toJSONString(obj) 如果要更换输出策略,操作方式如下: @Override protected void initApiConfig(ApiConfig apiConfig) { ... // 自定义json格式输出,将null字符串变成"" apiConfig.setJson

  • 网关默认对业务结果进行合并,然后返回统一的格式。 针对alipay.story.find接口,微服务端返回结果如下: { "name": "白雪公主", "id": 1, "gmtCreate": 1554193987378 } 网关合并后,最终结果如下 { "alipay_story_find_response": { "msg": "Succe

  • 我想定义一个返回int的异常。下面给出了我的代码。它显示出错误。 solution.cc:12:22:错误:为“virtual const int BadLengthException::what()const throw()”{^~~~指定的返回类型冲突,该文件包含的文件来自/usr/include/C++/7/Exception:38:0、来自/usr/include/C++/7/IOS:39

  • 主要内容:前记,1.自定义视图,2.自定义异常,3.自定义异常的原理前记 在前面的文章中, 表示了视图解析的原理和异常解析器的解析原理。 这篇通过如何自定义视图和自定义异常处理和自定义异常处理的原理进行说明。 这里说明一下, 自定义的视图和自定义的异常都是会代替容器默认的组件的, 异常还好说, 就是不符合就抛, 视图的话需要注意一下优先级, 可以在自定义的视图解析器上加上注解。 1.自定义视图 这里原理就是添加一个视图和视图解析器, 然后放入容器中, 最后访问相应

  • 问题 在你构建的应用程序中,你想将底层异常包装成自定义的异常。 解决方案 创建新的异常很简单——定义新的类,让它继承自 Exception (或者是任何一个已存在的异常类型)。 例如,如果你编写网络相关的程序,你可能会定义一些类似如下的异常: class NetworkError(Exception): pass class HostnameError(NetworkError):