如果没有定义的错误解码器,假客户端中的抛出声明是否无用?
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 抛出的异常。至少它应该这样工作。
我有一个这样的假客户
@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 抛出的异常。至少它应该这样工作。