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()) {