2

Fallback service is wrapping ProductNotFoundException into HystrixRunTimeException. I want to propagate custom exception as it is instead of wrapping into HystrixRunTimeException. Below is the code snippet for reference:

@FeignClient(name = "service1", fallback = FallBackService1.class )
public interface FeignService1{
      String validateProducts(Product product);
}

class FallBackService1 implements FeignService1{
  @override
  public String validateProducts(Product product){
     throw new ProductNotFoundException("P119","Product not found");
  }
}

I have enabled feign.hystrix.enable = true.

Please help with this. I want to propagate the exception as it is. I do not want it to be wrapped.

4

1 回答 1

1

告诉 hystrix 不要将自定义异常包装在回退方法中似乎是不可能的。您可以做的是创建您的自定义 ErrorDecoder 并从那里抛出您的自定义异常。在这种情况下,您的自定义异常应该实现,com.netflix.hystrix.exception.ExceptionNotWrappedByHystrix 否则 hystrix 会将其包装到HystrixRuntimeException.

简单的例子。

  1. 使用 ErrorDecoder 实现创建 feign 配置。请注意,如果您不希望所有 FeignClient 由同一个解码器处理,请不要使用 @Configuration 注解标记 FeignClient1Config。
import feign.codec.ErrorDecoder;
import org.springframework.context.annotation.Bean;

public class FeignClient1Config {

    @Bean
    public ErrorDecoder customErrorDecoder() {
        return (methodKey, response) -> {
            throw new ProductNotFoundException("P119","Product not found for request " + response.request());
        };
    }
}
  1. 你的假客户应该是这样的
@FeignClient(name = "service1", configuration = FeignClient1Config.class)
public interface FeignService1{
      String validateProducts(Product product);
}

这种实现的缺点是 FeignService1 中的所有方法都将由同一个错误解码器处理。

要克服它,您可以创建自己的 fallbackFactory 并将其作为属性添加到@FeignClient(fallbackFactory = ...) 或者我最喜欢的解决方案是这个 并且不要忘记实现 ExceptionNotWrappedByHystrix 类的异常。

于 2021-01-20T15:45:40.757 回答