Webclient ExchangeFilter 不是 return 定义的自定义异常 class

Webclient ExchangeFilter not return a defined custom exception class

我在执行 Web 客户端请求(向外部 api)并且响应是 4xx 或 5xx 代码时遇到问题。提议正在处理该响应并使用自定义 class

检索响应

网络客户端配置为

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

handlingFilter.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"
}

怎么了? 谢谢

要更改客户端的响应(端点的响应),您必须正确处理异常。查看 Spring 有关 Managing Exceptions

的文档

正在恢复:如果您正在使用注释端点,则必须在您的控制器 class 或 @RestControllerAdvice.

中创建一个 @ExceptionHandler(MyException.class)

如果您使用的是功能终结点,则配置 WebExceptionHandler