diff --git a/spring-cloud-starter-tencent-polaris-circuitbreaker/src/main/java/com/tencent/cloud/polaris/circuitbreaker/resttemplate/PolarisCircuitBreakerRestTemplateInterceptor.java b/spring-cloud-starter-tencent-polaris-circuitbreaker/src/main/java/com/tencent/cloud/polaris/circuitbreaker/resttemplate/PolarisCircuitBreakerRestTemplateInterceptor.java index dce9061c1..7750aebae 100644 --- a/spring-cloud-starter-tencent-polaris-circuitbreaker/src/main/java/com/tencent/cloud/polaris/circuitbreaker/resttemplate/PolarisCircuitBreakerRestTemplateInterceptor.java +++ b/spring-cloud-starter-tencent-polaris-circuitbreaker/src/main/java/com/tencent/cloud/polaris/circuitbreaker/resttemplate/PolarisCircuitBreakerRestTemplateInterceptor.java @@ -79,7 +79,7 @@ public class PolarisCircuitBreakerRestTemplateInterceptor implements ClientHttpR hasError = Boolean.parseBoolean(response.getHeaders().getFirst(HEADER_HAS_ERROR)); } if (hasError) { - restTemplate.getErrorHandler().handleError(request.getURI(), request.getMethod(), response); + errorHandler.handleError(request.getURI(), request.getMethod(), response); } return response; } diff --git a/spring-cloud-starter-tencent-polaris-circuitbreaker/src/test/java/com/tencent/cloud/polaris/circuitbreaker/PolarisCircuitBreakerFeignIntegrationTest.java b/spring-cloud-starter-tencent-polaris-circuitbreaker/src/test/java/com/tencent/cloud/polaris/circuitbreaker/PolarisCircuitBreakerFeignIntegrationTest.java index 911c4aff9..0583649d4 100644 --- a/spring-cloud-starter-tencent-polaris-circuitbreaker/src/test/java/com/tencent/cloud/polaris/circuitbreaker/PolarisCircuitBreakerFeignIntegrationTest.java +++ b/spring-cloud-starter-tencent-polaris-circuitbreaker/src/test/java/com/tencent/cloud/polaris/circuitbreaker/PolarisCircuitBreakerFeignIntegrationTest.java @@ -22,6 +22,7 @@ import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; +import java.lang.reflect.InvocationTargetException; import java.nio.charset.StandardCharsets; import java.util.stream.Collectors; @@ -104,9 +105,12 @@ public class PolarisCircuitBreakerFeignIntegrationTest { } @Test - public void testFeignClient() { + public void testFeignClient() throws InvocationTargetException { assertThat(echoService.echo("test")).isEqualTo("echo fallback"); Utils.sleepUninterrupted(2000); + assertThatThrownBy(() -> { + echoService.echo(null); + }).isInstanceOf(Exception.class); assertThatThrownBy(() -> { fooService.echo("test"); }).isInstanceOf(NoFallbackAvailableException.class); @@ -163,7 +167,7 @@ public class PolarisCircuitBreakerFeignIntegrationTest { public interface EchoService { @RequestMapping(path = "echo/{str}") - String echo(@RequestParam("str") String param); + String echo(@RequestParam("str") String param) throws InvocationTargetException; } @@ -198,7 +202,10 @@ public class PolarisCircuitBreakerFeignIntegrationTest { public static class EchoServiceFallback implements EchoService { @Override - public String echo(@RequestParam("str") String param) { + public String echo(@RequestParam("str") String param) throws InvocationTargetException { + if (param == null) { + throw new InvocationTargetException(new Exception()); + } return "echo fallback"; } diff --git a/spring-cloud-starter-tencent-polaris-circuitbreaker/src/test/java/com/tencent/cloud/polaris/circuitbreaker/PolarisCircuitBreakerRestTemplateIntegrationTest.java b/spring-cloud-starter-tencent-polaris-circuitbreaker/src/test/java/com/tencent/cloud/polaris/circuitbreaker/PolarisCircuitBreakerRestTemplateIntegrationTest.java index fdbf6c86c..6f954dd81 100644 --- a/spring-cloud-starter-tencent-polaris-circuitbreaker/src/test/java/com/tencent/cloud/polaris/circuitbreaker/PolarisCircuitBreakerRestTemplateIntegrationTest.java +++ b/spring-cloud-starter-tencent-polaris-circuitbreaker/src/test/java/com/tencent/cloud/polaris/circuitbreaker/PolarisCircuitBreakerRestTemplateIntegrationTest.java @@ -33,6 +33,9 @@ import com.tencent.cloud.polaris.circuitbreaker.config.PolarisCircuitBreakerFeig import com.tencent.cloud.polaris.circuitbreaker.resttemplate.PolarisCircuitBreakerFallback; import com.tencent.cloud.polaris.circuitbreaker.resttemplate.PolarisCircuitBreakerHttpResponse; import com.tencent.cloud.polaris.circuitbreaker.resttemplate.PolarisCircuitBreakerRestTemplate; +import com.tencent.cloud.rpc.enhancement.config.RpcEnhancementReporterProperties; +import com.tencent.cloud.rpc.enhancement.resttemplate.EnhancedRestTemplateReporter; +import com.tencent.polaris.api.core.ConsumerAPI; import com.tencent.polaris.api.pojo.ServiceKey; import com.tencent.polaris.circuitbreak.api.CircuitBreakAPI; import com.tencent.polaris.circuitbreak.factory.CircuitBreakAPIFactory; @@ -54,6 +57,7 @@ import org.springframework.cloud.openfeign.EnableFeignClients; import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.http.HttpHeaders; import org.springframework.http.HttpMethod; import org.springframework.http.HttpStatus; import org.springframework.test.annotation.DirtiesContext; @@ -66,6 +70,7 @@ import org.springframework.web.bind.annotation.RestController; import org.springframework.web.client.RestTemplate; import org.springframework.web.util.DefaultUriBuilderFactory; +import static com.tencent.cloud.rpc.enhancement.resttemplate.EnhancedRestTemplateReporter.HEADER_HAS_ERROR; import static com.tencent.polaris.test.common.TestUtils.SERVER_ADDRESS_ENV; import static org.assertj.core.api.Assertions.assertThat; import static org.springframework.boot.test.context.SpringBootTest.WebEnvironment.RANDOM_PORT; @@ -137,11 +142,14 @@ public class PolarisCircuitBreakerRestTemplateIntegrationTest { assertThat(defaultRestTemplate.getForObject("http://localhost:18001/example/service/b/info", String.class)).isEqualTo("OK"); mockServer.verify(); mockServer.reset(); + HttpHeaders headers = new HttpHeaders(); + headers.add(HEADER_HAS_ERROR, "true"); + // no delegateHandler in EnhancedRestTemplateReporter, so this will except err mockServer .expect(ExpectedCount.once(), requestTo(new URI("http://localhost:18001/example/service/b/info"))) .andExpect(method(HttpMethod.GET)) - .andRespond(withStatus(HttpStatus.BAD_GATEWAY).body("BAD_GATEWAY")); - assertThat(defaultRestTemplate.getForObject("http://localhost:18001/example/service/b/info", String.class)).isEqualTo("fallback"); + .andRespond(withStatus(HttpStatus.BAD_GATEWAY).headers(headers).body("BAD_GATEWAY")); + assertThat(defaultRestTemplate.getForObject("http://localhost:18001/example/service/b/info", String.class)).isEqualTo("BAD_GATEWAY"); mockServer.verify(); mockServer.reset(); assertThat(restTemplateFallbackFromCode.getForObject("/example/service/b/info", String.class)).isEqualTo("\"this is a fallback class\""); @@ -167,8 +175,11 @@ public class PolarisCircuitBreakerRestTemplateIntegrationTest { @Bean @PolarisCircuitBreakerRestTemplate(fallback = "fallback") - public RestTemplate defaultRestTemplate() { - return new RestTemplate(); + public RestTemplate defaultRestTemplate(RpcEnhancementReporterProperties properties, ConsumerAPI consumerAPI) { + RestTemplate defaultRestTemplate = new RestTemplate(); + EnhancedRestTemplateReporter enhancedRestTemplateReporter = new EnhancedRestTemplateReporter(properties, consumerAPI); + defaultRestTemplate.setErrorHandler(enhancedRestTemplateReporter); + return defaultRestTemplate; } @Bean