如果没有定义的错误解码器,假客户端中的抛出声明是否无用?

Is throws declaration in feign client useless without defined error decoder?

我有一个这样的假客户

@FeignClient(name = "client")
public interface SomeClient {
    @RequestLine("GET /?q={q}")
    void execute(URI baseUrl, @Param("q") String q) throws SomeExceptionInMyCode;
}

看着这个 throws SomeExceptionInMyCode 我在问自己什么时候会抛出这个异常。没有为客户端定义的配置,没有错误解码器。异常看起来像这样。

public class SomeExceptionInMyCode extends Exception{

    private final int statusCode;
    private final String reason;
    private final String body;

    // getters and setters
}

如果失败,是否会自动尝试解码对此异常的 HTTP 响应?或者throws SomeExceptionInMyCode没用,可以去掉,没有任何影响。

我在我的代码中进行了搜索,但从未创建过此异常。

Will there be an automatic attempt to decode http response to this exception in case of failure?

不,这样不行,SomeExceptionMyCode 不会被抛出。 throws 子句没有用。即使端点从其实现中抛出此异常,它也会被包装为 FeignException.

的原因

处理假客户端异常的正确方法是使用 Custom exception handling 实现 ErrorDecoder:

public class StashErrorDecoder implements ErrorDecoder {

    @Override
    public Exception decode(String methodKey, Response response) {
        if (response.status() >= 400 && response.status() <= 499) {
            // return 4XX exception
        }
        if (response.status() >= 500 && response.status() <= 599) {
            // return 5XX exception
        }
    }
}

此时您可以执行自定义异常创建和重新抛出。

另一种解决方案是使用 Spring-like @RestControllerAdvice:

@RestControllerAdvice
public class ExceptionHandler {

    @ExceptionHandler(FeignException.class)
    public String handleFeignStatusException(FeignException e, HttpServletResponse response) {
        // ...
    }

}

如果 StashErrorDecoder 抛出检查异常怎么办?这是允许的。在这种情况下,界面中的 throws 子句肯定有帮助。这样就可以捕获并处理 Feign 抛出的异常。至少它应该这样工作。