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 <[email protected]>
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 <[email protected]>
    Co-authored-by: aias00 <[email protected]>
---
 .../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()) {

Reply via email to