【发布时间】:2017-03-22 13:43:49
【问题描述】:
我正在设计一个服务外观,并且我有一个如下所示的方法签名:
public Policy getPolicy(long policyId) throws PolicyNotFoundException
如果没有发生任何错误,则返回一个 Policy 对象(简单 POJO)。如果未找到请求的策略,则抛出已检查的异常 PolicyNotFoundException(仅作为参考 - 当涉及应用程序中异常处理的最佳实践时,我们遵循 this article)。
服务外观层之上的层(在本例中为Spring MVC RestController)知道如何处理此类 PolicyNotFoundException 并返回适当的负载。
我正在尝试通过执行以下操作将其合并到 HystrixCommand 中:
@HystrixCommand(groupKey = "PolicyService", fallbackMethod = "getPolicySafe", ignoreExceptions = { PolicyNotFoundException.class })
public Policy getPolicy(long policyId) throws PolicyNotFoundException {
LOGGER.info("Getting policy {}", policyId);
// Simulate some error condition for testing purposes
throw new RuntimeException("Something happened!");
}
private Policy getPolicySafe(long policyId, Throwable t) throws PolicyNotFoundException {
LOGGER.warn("Falling back to circuit-breaker for getting policy {}", policyId, t);
throw new PolicyNotFoundException(policyId);
}
基本上,我希望我的断路器的行为就像原始查找未找到该策略一样。我遇到的问题是我从后备方法抛出的异常在某处的翻译中丢失了。我最终在上层看到的异常是命令方法抛出的 RuntimeException,而不是回退方法抛出的异常。有没有解决的办法?我也不想更改原始方法的合同,也不想让上面的层知道除了在找不到策略的情况下必须捕获 PolicyNotFoundException 之外的任何内容。此处需要的任何内容都应在此服务外观层中捕获。
我们将不胜感激任何和所有的帮助。谢谢!
【问题讨论】:
标签: spring-cloud hystrix spring-cloud-netflix