You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shenyu.apache.org by li...@apache.org on 2026/09/04 01:16:06 UTC
(shenyu) branch master updated: [type: bug] Fix NPE in Hystrix/Resilience4J/Sentinel/RateLimiter plugins (#6877) (#7008)
This is an automated email from the ASF dual-hosted git repository.
Aias00 pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/shenyu.git
The following commit(s) were added to refs/heads/master by this push:
new d3dcaa814a [type: bug] Fix NPE in Hystrix/Resilience4J/Sentinel/RateLimiter plugins (#6877) (#7008)
d3dcaa814a is described below
commit d3dcaa814a47333f05a55e5cbfcf693da0386f41
Author: Arvin <31...@users.noreply.github.com>
AuthorDate: Fri Sep 4 09:15:59 2026 +0800
[type: bug] Fix NPE in Hystrix/Resilience4J/Sentinel/RateLimiter plugins (#6877) (#7008)
Signed-off-by: zhang-arvin <ar...@htx-inc.com>
Co-authored-by: aias00 <li...@apache.org>
---
.../src/main/java/org/apache/shenyu/plugin/hystrix/HystrixPlugin.java | 4 ++++
.../java/org/apache/shenyu/plugin/ratelimiter/RateLimiterPlugin.java | 4 ++++
.../org/apache/shenyu/plugin/resilience4j/Resilience4JPlugin.java | 3 +++
.../main/java/org/apache/shenyu/plugin/sentinel/SentinelPlugin.java | 3 +++
4 files changed, 14 insertions(+)
diff --git a/shenyu-plugin/shenyu-plugin-fault-tolerance/shenyu-plugin-hystrix/src/main/java/org/apache/shenyu/plugin/hystrix/HystrixPlugin.java b/shenyu-plugin/shenyu-plugin-fault-tolerance/shenyu-plugin-hystrix/src/main/java/org/apache/shenyu/plugin/hystrix/HystrixPlugin.java
index 00fcf0c789..b8ec643cd0 100644
--- a/shenyu-plugin/shenyu-plugin-fault-tolerance/shenyu-plugin-hystrix/src/main/java/org/apache/shenyu/plugin/hystrix/HystrixPlugin.java
+++ b/shenyu-plugin/shenyu-plugin-fault-tolerance/shenyu-plugin-hystrix/src/main/java/org/apache/shenyu/plugin/hystrix/HystrixPlugin.java
@@ -57,6 +57,10 @@ public class HystrixPlugin extends AbstractShenyuPlugin {
final ShenyuContext shenyuContext = exchange.getAttribute(Constants.CONTEXT);
Objects.requireNonNull(shenyuContext);
final HystrixHandle hystrixHandle = HystrixPluginDataHandler.CACHED_HANDLE.get().obtainHandle(CacheKeyUtils.INST.getKey(rule));
+ if (Objects.isNull(hystrixHandle)) {
+ LOG.error("hystrix handler is null, rule: {}", rule);
+ return chain.execute(exchange);
+ }
String groupKey = hystrixHandle.getGroupKey();
if (StringUtils.isBlank(hystrixHandle.getGroupKey())) {
groupKey = Objects.requireNonNull(shenyuContext).getModule();
diff --git a/shenyu-plugin/shenyu-plugin-fault-tolerance/shenyu-plugin-ratelimiter/src/main/java/org/apache/shenyu/plugin/ratelimiter/RateLimiterPlugin.java b/shenyu-plugin/shenyu-plugin-fault-tolerance/shenyu-plugin-ratelimiter/src/main/java/org/apache/shenyu/plugin/ratelimiter/RateLimiterPlugin.java
index 5b101070d3..bd2e4728af 100644
--- a/shenyu-plugin/shenyu-plugin-fault-tolerance/shenyu-plugin-ratelimiter/src/main/java/org/apache/shenyu/plugin/ratelimiter/RateLimiterPlugin.java
+++ b/shenyu-plugin/shenyu-plugin-fault-tolerance/shenyu-plugin-ratelimiter/src/main/java/org/apache/shenyu/plugin/ratelimiter/RateLimiterPlugin.java
@@ -38,6 +38,7 @@ import org.springframework.http.HttpStatusCode;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;
+import java.util.Objects;
import java.util.Optional;
import java.util.function.Consumer;
@@ -71,6 +72,9 @@ public class RateLimiterPlugin extends AbstractShenyuPlugin {
protected Mono<Void> doExecute(final ServerWebExchange exchange, final ShenyuPluginChain chain, final SelectorData selector, final RuleData rule) {
RateLimiterHandle limiterHandle = RateLimiterPluginDataHandler.CACHED_HANDLE.get()
.obtainHandle(CacheKeyUtils.INST.getKey(rule));
+ if (Objects.isNull(limiterHandle)) {
+ return chain.execute(exchange);
+ }
String resolverKey = Optional.ofNullable(limiterHandle.getKeyResolverName())
.flatMap(name -> Optional.of("-" + RateLimiterKeyResolverFactory.newInstance(name).resolve(exchange)))
.orElse("");
diff --git a/shenyu-plugin/shenyu-plugin-fault-tolerance/shenyu-plugin-resilience4j/src/main/java/org/apache/shenyu/plugin/resilience4j/Resilience4JPlugin.java b/shenyu-plugin/shenyu-plugin-fault-tolerance/shenyu-plugin-resilience4j/src/main/java/org/apache/shenyu/plugin/resilience4j/Resilience4JPlugin.java
index 3a27c8e2e6..554053698b 100644
--- a/shenyu-plugin/shenyu-plugin-fault-tolerance/shenyu-plugin-resilience4j/src/main/java/org/apache/shenyu/plugin/resilience4j/Resilience4JPlugin.java
+++ b/shenyu-plugin/shenyu-plugin-fault-tolerance/shenyu-plugin-resilience4j/src/main/java/org/apache/shenyu/plugin/resilience4j/Resilience4JPlugin.java
@@ -64,6 +64,9 @@ public class Resilience4JPlugin extends AbstractShenyuPlugin {
final ShenyuContext shenyuContext = exchange.getAttribute(Constants.CONTEXT);
Objects.requireNonNull(shenyuContext);
Resilience4JHandle resilience4JHandle = Resilience4JHandler.CACHED_HANDLE.get().obtainHandle(CacheKeyUtils.INST.getKey(rule));
+ if (Objects.isNull(resilience4JHandle)) {
+ return chain.execute(exchange);
+ }
resilience4JHandle.checkData(resilience4JHandle);
if (resilience4JHandle.getCircuitEnable() == 1) {
return combined(exchange, chain, rule);
diff --git a/shenyu-plugin/shenyu-plugin-fault-tolerance/shenyu-plugin-sentinel/src/main/java/org/apache/shenyu/plugin/sentinel/SentinelPlugin.java b/shenyu-plugin/shenyu-plugin-fault-tolerance/shenyu-plugin-sentinel/src/main/java/org/apache/shenyu/plugin/sentinel/SentinelPlugin.java
index 342587ac93..dd2719ab07 100644
--- a/shenyu-plugin/shenyu-plugin-fault-tolerance/shenyu-plugin-sentinel/src/main/java/org/apache/shenyu/plugin/sentinel/SentinelPlugin.java
+++ b/shenyu-plugin/shenyu-plugin-fault-tolerance/shenyu-plugin-sentinel/src/main/java/org/apache/shenyu/plugin/sentinel/SentinelPlugin.java
@@ -57,6 +57,9 @@ public class SentinelPlugin extends AbstractShenyuPlugin {
Objects.requireNonNull(shenyuContext);
String resourceName = CacheKeyUtils.INST.getKey(rule);
SentinelHandle sentinelHandle = SentinelRuleHandle.CACHED_HANDLE.get().obtainHandle(resourceName);
+ if (Objects.isNull(sentinelHandle)) {
+ return chain.execute(exchange);
+ }
sentinelHandle.checkData();
exchange.getAttributes().put(Constants.WATCHER_HTTP_STATUS, (Consumer<HttpStatus>) status -> {
if (Objects.isNull(status) || !status.is2xxSuccessful()) {