【问题标题】:Client side error handling with Micronaut使用 Micronaut 进行客户端错误处理
【发布时间】:2021-01-27 03:29:55
【问题描述】:

我在 REST 服务和消费者应用程序之间使用 Micronaut 层。 |REST 服务|->|Micronaut 客户端/控制器|->|消费者应用程序|。 当 REST 服务返回错误时,控制器应传播错误代码。 当 REST 服务离线时,控制器应该返回某种 500 错误代码。 但是,现在它在两种情况下都返回一个带有 200 错误代码的空正文。

这里的例子是我的控制器:

@Controller("/api/v1") 
public class MyController {

private final ClientNetworkList clientNetworkList;

public MyController( 
    ClientNetworkList clientNetworkList,
){
    this.clientNetworkList = clientNetworkList;
}

    @Get(uri = "/networkList", produces = MediaType.APPLICATION_JSON_STREAM)
    Flowable<NetworkListPackage> packagesNetworkList() { 
        return clientNetworkList.fetchPackages();
    }
}

还有客户:

@Client(FabricConfiguration.FABRIC_API_URL) 
public interface ClientNetworkList{
     @Get("/auth/networklist") 
    Flowable<NetworkListPackage> fetchPackages();   
}

如何传播或抛出正确的正文和错误代码? @Error 注解应该如何使用,应该在控制器中实现还是在过滤器中实现?

【问题讨论】:

  • 你能显示ClientNetworkList的源代码吗?
  • 抱歉打错了。 “ClientNetworkList”实际上是@client 接口。现在已在问题中更正。
  • 我确定这只是这里的代码错误,不是真正的代码,但我认为this.ClientNetworkList应该是this.clientNetworkListreturn clientNetworkList.fetchPackages();应该是return clientNetworkList.fetchPackages();
  • 是的,谢谢你看到这个。

标签: rest exception error-handling micronaut error-code


【解决方案1】:

Micronaut 为此类事情提供断路器支持。

我建议使用@Fallback 注释并抛出一个异常,这将产生 500 错误代码。请参阅 Micronaut 文档中的 7.3.7 Client Fallback

【讨论】:

  • 感谢您的回答。除了您提供的示例外,我找不到任何其他示例。 @Fallback 是否必须在客户端中实现? Fallback 究竟响应了什么错误代码?
  • 您必须创建一个实现客户端的后备类。作为示例,请参阅 Fallback Example Pet Store 在您的情况下,您将实现方法 fetchPackages。在您的回退的 fetchPackages 方法中,您可以简单地抛出一个异常,这将导致 500er。如果您计划自定义退货,请查看ExceptionHandler
  • "Micronaut has a Circuit Breaker Support for such things." - 这是真的,但只是为了清楚起见,如上所述,您可能想要@Fallback@CircuitBreaker 可能与问题无关。这种情况并不是真的要打破电路。
猜你喜欢
  • 2018-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-20
  • 2019-04-03
  • 2021-10-12
相关资源
最近更新 更多