From 0a8f204853089c9a0c140077776907194536fd21 Mon Sep 17 00:00:00 2001 From: Haotian Zhang <928016560@qq.com> Date: Tue, 13 Sep 2022 15:22:32 +0800 Subject: [PATCH] fix:fix NullPointerException error when using RestTemplate with no label. --- CHANGELOG.md | 1 + ...PolarisRouterServiceInstanceListSupplier.java | 9 +++++++-- .../PolarisLoadBalancerInterceptor.java | 16 +++++++--------- spring-cloud-tencent-dependencies/pom.xml | 2 +- 4 files changed, 16 insertions(+), 12 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1218670ad..4089d1fd7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -37,3 +37,4 @@ - [refactor:optimize project and code.](https://github.com/Tencent/spring-cloud-tencent/pull/571) - [Optimize:change default dynamic config refresh type to reflect.](https://github.com/Tencent/spring-cloud-tencent/pull/575) - [feat:optimize examples.](https://github.com/Tencent/spring-cloud-tencent/pull/578) +- [fix:fix NullPointerException error when using RestTemplate with no label.](https://github.com/Tencent/spring-cloud-tencent/pull/586) diff --git a/spring-cloud-starter-tencent-polaris-router/src/main/java/com/tencent/cloud/polaris/router/PolarisRouterServiceInstanceListSupplier.java b/spring-cloud-starter-tencent-polaris-router/src/main/java/com/tencent/cloud/polaris/router/PolarisRouterServiceInstanceListSupplier.java index 540fd231b..480809aca 100644 --- a/spring-cloud-starter-tencent-polaris-router/src/main/java/com/tencent/cloud/polaris/router/PolarisRouterServiceInstanceListSupplier.java +++ b/spring-cloud-starter-tencent-polaris-router/src/main/java/com/tencent/cloud/polaris/router/PolarisRouterServiceInstanceListSupplier.java @@ -25,6 +25,7 @@ import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Optional; import com.tencent.cloud.common.constant.RouterConstants; import com.tencent.cloud.common.metadata.MetadataContext; @@ -121,8 +122,12 @@ public class PolarisRouterServiceInstanceListSupplier extends DelegatingServiceI Map labelHeaderValuesMap = new HashMap<>(); try { - String labelHeaderValuesContent = labelHeaderValues.stream().findFirst().get(); - labelHeaderValuesMap.putAll(JacksonUtils.deserialize2Map(URLDecoder.decode(labelHeaderValuesContent, UTF_8))); + Optional labelHeaderValuesOptional = labelHeaderValues.stream().findFirst(); + if (labelHeaderValuesOptional.isPresent()) { + String labelHeaderValuesContent = labelHeaderValuesOptional.get(); + labelHeaderValuesMap.putAll( + JacksonUtils.deserialize2Map(URLDecoder.decode(labelHeaderValuesContent, UTF_8))); + } } catch (UnsupportedEncodingException e) { throw new RuntimeException("unsupported charset exception " + UTF_8); diff --git a/spring-cloud-starter-tencent-polaris-router/src/main/java/com/tencent/cloud/polaris/router/resttemplate/PolarisLoadBalancerInterceptor.java b/spring-cloud-starter-tencent-polaris-router/src/main/java/com/tencent/cloud/polaris/router/resttemplate/PolarisLoadBalancerInterceptor.java index e43662b94..8cd4c9144 100644 --- a/spring-cloud-starter-tencent-polaris-router/src/main/java/com/tencent/cloud/polaris/router/resttemplate/PolarisLoadBalancerInterceptor.java +++ b/spring-cloud-starter-tencent-polaris-router/src/main/java/com/tencent/cloud/polaris/router/resttemplate/PolarisLoadBalancerInterceptor.java @@ -50,11 +50,13 @@ import org.springframework.http.client.ClientHttpResponse; import org.springframework.util.Assert; import org.springframework.util.CollectionUtils; +import static com.tencent.cloud.common.constant.ContextConstant.UTF_8; + /** * PolarisLoadBalancerInterceptor extends LoadBalancerInterceptor capabilities. * Parses the label from the request and puts it into the RouterContext for routing. * - *@author lepdou 2022-05-18 + * @author lepdou, cheese8 */ public class PolarisLoadBalancerInterceptor extends LoadBalancerInterceptor { private static final Logger LOGGER = LoggerFactory.getLogger(PolarisLoadBalancerInterceptor.class); @@ -132,18 +134,14 @@ public class PolarisLoadBalancerInterceptor extends LoadBalancerInterceptor { labels.putAll(transitiveLabels); // pass label by header - if (labels.size() == 0) { - request.getHeaders().set(RouterConstants.ROUTER_LABEL_HEADER, null); - return; - } + String encodedLabelsContent; try { - String headerMetadataStr = URLEncoder.encode(JacksonUtils.serialize2Json(labels), "UTF-8"); - request.getHeaders().set(RouterConstants.ROUTER_LABEL_HEADER, headerMetadataStr); + encodedLabelsContent = URLEncoder.encode(JacksonUtils.serialize2Json(labels), UTF_8); } catch (UnsupportedEncodingException e) { - LOGGER.error("Set header failed.", e); - throw new RuntimeException(e); + throw new RuntimeException("unsupported charset exception " + UTF_8); } + request.getHeaders().set(RouterConstants.ROUTER_LABEL_HEADER, encodedLabelsContent); } private Map getExpressionLabels(HttpRequest request, Set labelKeys) { diff --git a/spring-cloud-tencent-dependencies/pom.xml b/spring-cloud-tencent-dependencies/pom.xml index 7a4e4c433..a2c4cf3b5 100644 --- a/spring-cloud-tencent-dependencies/pom.xml +++ b/spring-cloud-tencent-dependencies/pom.xml @@ -73,7 +73,7 @@ 1.7.0-2021.0.3-SNAPSHOT - 1.7.4-SNAPSHOT + 1.7.4 31.0.1-jre 1.2.11 4.5.1