从Spring Cloud Breaker Resilience4j中的NoFallbackAvailableException获取响应主体

问题描述

我想调用第三方API。我使用弹簧云断路器的弹性4j。

这是我的服务班级:

package ir.co.isc.resilience4jservice.service;

import ir.co.isc.resilience4jservice.model.Employee;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.circuitbreaker.CircuitBreaker;
import org.springframework.cloud.client.circuitbreaker.CircuitBreakerFactory;
import org.springframework.cloud.client.circuitbreaker.NoFallbackAvailableException;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;

 @Service
public class EmployeeService {

@Autowired
private RestTemplate restTemplate;

@Autowired
private CircuitBreakerFactory circuitBreakerFactory;

public Employee getEmployee() {
    try {
        String url = "http://localhost:8090/employee";

        CircuitBreaker circuitBreaker = circuitBreakerFactory.create("circuit-breaker");

        return circuitBreaker.run(() -> restTemplate.getForObject(url,Employee.class));
    } catch (NoFallbackAvailableException e) {
        //I should extract error response body and do right action then return correct answer
        return null;
    }
   }
 }

ResilienceConfig:

package ir.co.isc.resilience4jservice.config;

import io.github.resilience4j.circuitbreaker.CircuitBreakerConfig;
import io.github.resilience4j.timelimiter.TimeLimiterConfig;
import org.springframework.cloud.circuitbreaker.resilience4j.Resilience4JCircuitBreakerFactory;
import org.springframework.cloud.circuitbreaker.resilience4j.Resilience4JConfigBuilder;
import org.springframework.cloud.client.circuitbreaker.Customizer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.time.Duration;

@Configuration
public class CircuitBreakerConfiguration {

@Bean
public Customizer<Resilience4JCircuitBreakerFactory> defaultCustomizer() {
    CircuitBreakerConfig circuitBreakerConfig = CircuitBreakerConfig.custom()
            .slidingWindowType(CircuitBreakerConfig.SlidingWindowType.COUNT_BASED)
            .slidingWindowSize(10)
            .minimumNumberOfCalls(10)
            .failureRateThreshold(25)
            .permittedNumberOfCallsInHalfOpenState(3)
            .build();

    TimeLimiterConfig timeLimiterConfig = TimeLimiterConfig.custom()
            .timeoutDuration(Duration.ofSeconds(4))
            .build();

    return factory ->
            factory.configureDefault(id -> new Resilience4JConfigBuilder(id)
                    .circuitBreakerConfig(circuitBreakerConfig)
                    .timeLimiterConfig(timeLimiterConfig)
                    .build());
    }

 }

在某些情况下,第三方api返回statusCode = 500的ResponseEntity和 正文= {“ errorCode”:“ CCBE”}。

响应看起来像这样:

[503] during [POST] to [http://localhost:8090/employee]:[{"errorCode":"CCBE"}] 

当我调用此API并获得正文的内部服务器错误时,我的catch块将捕获api响应。 在catch块中,我需要检索响应主体并根据errorCode进行一些操作。

但是我不能这样做。

在这种情况下如何提取身体?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...