Skip to content

RedisRateLimiter and RequestRateLimiterGatewayFilterFactory lack default constructors, causing ConfigurationPropertiesRebinder WARN on config refresh #4233

Description

@xuxiaowei-com-cn

Describe the bug

When Spring Cloud configuration refresh is triggered (e.g., via Consul, Nacos, or any config source), ConfigurationPropertiesRebinder iterates over all @ConfigurationProperties beans and tries to reset them by creating new instances via reflection. Both RedisRateLimiter and RequestRateLimiterGatewayFilterFactory are annotated with @ConfigurationProperties, but neither class has a default no-arg constructor. This causes BeanInstantiationException / NoSuchMethodException during the rebind process, emitting WARN logs:

WARN .s.c.c.p.ConfigurationPropertiesRebinder : Cannot create default instance of org.springframework.cloud.gateway.filter.ratelimit.RedisRateLimiter for reset; skipping property reset
org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.cloud.gateway.filter.ratelimit.RedisRateLimiter]: No default constructor found
...
Caused by: java.lang.NoSuchMethodException: org.springframework.cloud.gateway.filter.ratelimit.RedisRateLimiter.<init>()
WARN .s.c.c.p.ConfigurationPropertiesRebinder : Cannot create default instance of org.springframework.cloud.gateway.filter.factory.RequestRateLimiterGatewayFilterFactory for reset; skipping property reset
org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.cloud.gateway.filter.factory.RequestRateLimiterGatewayFilterFactory]: No default constructor found
...
Caused by: java.lang.NoSuchMethodException: org.springframework.cloud.gateway.filter.factory.RequestRateLimiterGatewayFilterFactory.<init>()

This issue was initially reported against spring-cloud-alibaba (alibaba/spring-cloud-alibaba#4359), but we confirmed it is unrelated to spring-cloud-alibaba — the same WARN occurs with pure Spring Cloud Gateway + Consul (no spring-cloud-alibaba dependencies at all).

Version

  • Spring Cloud 2025.1.2
  • Spring Boot 4.1.0
  • Java 25

Root Cause

RedisRateLimiter and RequestRateLimiterGatewayFilterFactory are @ConfigurationProperties beans without a default no-arg constructor. When ConfigurationPropertiesRebinder.resetBeanToDefaults() (in spring-cloud-commons) tries to call BeanUtils.instantiateClass() on them during a RefreshEvent, it fails because Class.getDeclaredConstructor() cannot find <init>().

Expected Behavior

Either:

  1. Both classes should provide a default no-arg constructor so they can be instantiated by ConfigurationPropertiesRebinder, or
  2. They should not participate in @ConfigurationProperties rebinding.

Sample

A minimal reproduction project is available at:
https://github.com/xuxiaowei-com-cn/spring-cloud-alibaba-issues-4359

The project uses Spring Cloud Gateway + Consul Config (no spring-cloud-alibaba deps), and the WARN is reproduced by simply updating a Consul config key to trigger a RefreshEvent.

Stack Trace

Full stack traces are in the original issue: alibaba/spring-cloud-alibaba#4359

2026-07-07 10:23:45.787+08:00  WARN 17112 --- [basic-paper-gateway] [listener.task-0] .s.c.c.p.ConfigurationPropertiesRebinder : Cannot create default instance of org.springframework.cloud.gateway.filter.ratelimit.RedisRateLimiter for reset; skipping property reset

org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.cloud.gateway.filter.ratelimit.RedisRateLimiter]: No default constructor found
	at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:143) ~[spring-beans-7.0.8.jar:7.0.8]
	at org.springframework.cloud.context.properties.ConfigurationPropertiesRebinder.resetBeanToDefaults(ConfigurationPropertiesRebinder.java:192) ~[spring-cloud-context-5.0.2.jar:5.0.2]
	at org.springframework.cloud.context.properties.ConfigurationPropertiesRebinder.rebind(ConfigurationPropertiesRebinder.java:167) ~[spring-cloud-context-5.0.2.jar:5.0.2]
	at org.springframework.cloud.context.properties.ConfigurationPropertiesRebinder.rebind(ConfigurationPropertiesRebinder.java:111) ~[spring-cloud-context-5.0.2.jar:5.0.2]
	at org.springframework.cloud.context.properties.ConfigurationPropertiesRebinder.rebind(ConfigurationPropertiesRebinder.java:99) ~[spring-cloud-context-5.0.2.jar:5.0.2]
	at org.springframework.cloud.context.properties.ConfigurationPropertiesRebinder.onApplicationEvent(ConfigurationPropertiesRebinder.java:261) ~[spring-cloud-context-5.0.2.jar:5.0.2]
	at org.springframework.cloud.context.properties.ConfigurationPropertiesRebinder.onApplicationEvent(ConfigurationPropertiesRebinder.java:65) ~[spring-cloud-context-5.0.2.jar:5.0.2]
	at org.springframework.context.event.SimpleApplicationEventMulticaster.doInvokeListener(SimpleApplicationEventMulticaster.java:180) ~[spring-context-7.0.8.jar:7.0.8]
	at org.springframework.context.event.SimpleApplicationEventMulticaster.invokeListener(SimpleApplicationEventMulticaster.java:173) ~[spring-context-7.0.8.jar:7.0.8]
	at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:151) ~[spring-context-7.0.8.jar:7.0.8]
	at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:448) ~[spring-context-7.0.8.jar:7.0.8]
	at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:381) ~[spring-context-7.0.8.jar:7.0.8]
	at org.springframework.cloud.context.refresh.ContextRefresher.refreshEnvironment(ContextRefresher.java:103) ~[spring-cloud-context-5.0.2.jar:5.0.2]
	at org.springframework.cloud.context.refresh.ContextRefresher.refresh(ContextRefresher.java:94) ~[spring-cloud-context-5.0.2.jar:5.0.2]
	at org.springframework.cloud.endpoint.event.RefreshEventListener.handle(RefreshEventListener.java:72) ~[spring-cloud-context-5.0.2.jar:5.0.2]
	at org.springframework.cloud.endpoint.event.RefreshEventListener.onApplicationEvent(RefreshEventListener.java:61) ~[spring-cloud-context-5.0.2.jar:5.0.2]
	at org.springframework.context.event.SimpleApplicationEventMulticaster.doInvokeListener(SimpleApplicationEventMulticaster.java:180) ~[spring-context-7.0.8.jar:7.0.8]
	at org.springframework.context.event.SimpleApplicationEventMulticaster.invokeListener(SimpleApplicationEventMulticaster.java:173) ~[spring-context-7.0.8.jar:7.0.8]
	at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:151) ~[spring-context-7.0.8.jar:7.0.8]
	at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:448) ~[spring-context-7.0.8.jar:7.0.8]
	at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:381) ~[spring-context-7.0.8.jar:7.0.8]
	at com.alibaba.cloud.nacos.configdata.NacosConfigRefreshEventListener.onApplicationEvent(NacosConfigRefreshEventListener.java:52) ~[spring-cloud-starter-alibaba-nacos-config-2025.1.0.0.jar:2025.1.0.0]
	at org.springframework.context.event.SimpleApplicationEventMulticaster.doInvokeListener(SimpleApplicationEventMulticaster.java:180) ~[spring-context-7.0.8.jar:7.0.8]
	at org.springframework.context.event.SimpleApplicationEventMulticaster.invokeListener(SimpleApplicationEventMulticaster.java:173) ~[spring-context-7.0.8.jar:7.0.8]
	at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:151) ~[spring-context-7.0.8.jar:7.0.8]
	at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:448) ~[spring-context-7.0.8.jar:7.0.8]
	at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:381) ~[spring-context-7.0.8.jar:7.0.8]
	at com.alibaba.cloud.nacos.refresh.NacosContextRefresher$1.innerReceive(NacosContextRefresher.java:131) ~[spring-alibaba-nacos-config-2025.1.0.0.jar:2025.1.0.0]
	at com.alibaba.nacos.api.config.listener.AbstractSharedListener.receiveConfigInfo(AbstractSharedListener.java:40) ~[nacos-client-3.1.1.jar:na]
	at com.alibaba.nacos.client.config.impl.CacheData$1.run(CacheData.java:462) ~[nacos-client-3.1.1.jar:na]
	at com.alibaba.nacos.client.config.impl.CacheData.safeNotifyListener(CacheData.java:505) ~[nacos-client-3.1.1.jar:na]
	at com.alibaba.nacos.client.config.impl.CacheData.checkListenerMd5(CacheData.java:345) ~[nacos-client-3.1.1.jar:na]
	at com.alibaba.nacos.client.config.impl.ClientWorker$ConfigRpcTransportClient.refreshContentAndCheck(ClientWorker.java:1035) ~[nacos-client-3.1.1.jar:na]
	at com.alibaba.nacos.client.config.impl.ClientWorker$ConfigRpcTransportClient.refreshContentAndCheck(ClientWorker.java:1016) ~[nacos-client-3.1.1.jar:na]
	at com.alibaba.nacos.client.config.impl.ClientWorker$ConfigRpcTransportClient.lambda$checkListenCache$8(ClientWorker.java:1126) ~[nacos-client-3.1.1.jar:na]
	at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:572) ~[na:na]
	at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:317) ~[na:na]
	at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144) ~[na:na]
	at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642) ~[na:na]
	at java.base/java.lang.Thread.run(Thread.java:1583) ~[na:na]
Caused by: java.lang.NoSuchMethodException: org.springframework.cloud.gateway.filter.ratelimit.RedisRateLimiter.<init>()
	at java.base/java.lang.Class.getConstructor0(Class.java:3761) ~[na:na]
	at java.base/java.lang.Class.getDeclaredConstructor(Class.java:2930) ~[na:na]
	at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:138) ~[spring-beans-7.0.8.jar:7.0.8]
	... 39 common frames omitted
2026-07-07 10:23:45.712+08:00  WARN 17112 --- [basic-paper-gateway] [listener.task-0] .s.c.c.p.ConfigurationPropertiesRebinder : Cannot create default instance of org.springframework.cloud.gateway.filter.factory.RequestRateLimiterGatewayFilterFactory for reset; skipping property reset

org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.cloud.gateway.filter.factory.RequestRateLimiterGatewayFilterFactory]: No default constructor found
	at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:143) ~[spring-beans-7.0.8.jar:7.0.8]
	at org.springframework.cloud.context.properties.ConfigurationPropertiesRebinder.resetBeanToDefaults(ConfigurationPropertiesRebinder.java:192) ~[spring-cloud-context-5.0.2.jar:5.0.2]
	at org.springframework.cloud.context.properties.ConfigurationPropertiesRebinder.rebind(ConfigurationPropertiesRebinder.java:167) ~[spring-cloud-context-5.0.2.jar:5.0.2]
	at org.springframework.cloud.context.properties.ConfigurationPropertiesRebinder.rebind(ConfigurationPropertiesRebinder.java:111) ~[spring-cloud-context-5.0.2.jar:5.0.2]
	at org.springframework.cloud.context.properties.ConfigurationPropertiesRebinder.rebind(ConfigurationPropertiesRebinder.java:99) ~[spring-cloud-context-5.0.2.jar:5.0.2]
	at org.springframework.cloud.context.properties.ConfigurationPropertiesRebinder.onApplicationEvent(ConfigurationPropertiesRebinder.java:261) ~[spring-cloud-context-5.0.2.jar:5.0.2]
	at org.springframework.cloud.context.properties.ConfigurationPropertiesRebinder.onApplicationEvent(ConfigurationPropertiesRebinder.java:65) ~[spring-cloud-context-5.0.2.jar:5.0.2]
	at org.springframework.context.event.SimpleApplicationEventMulticaster.doInvokeListener(SimpleApplicationEventMulticaster.java:180) ~[spring-context-7.0.8.jar:7.0.8]
	at org.springframework.context.event.SimpleApplicationEventMulticaster.invokeListener(SimpleApplicationEventMulticaster.java:173) ~[spring-context-7.0.8.jar:7.0.8]
	at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:151) ~[spring-context-7.0.8.jar:7.0.8]
	at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:448) ~[spring-context-7.0.8.jar:7.0.8]
	at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:381) ~[spring-context-7.0.8.jar:7.0.8]
	at org.springframework.cloud.context.refresh.ContextRefresher.refreshEnvironment(ContextRefresher.java:103) ~[spring-cloud-context-5.0.2.jar:5.0.2]
	at org.springframework.cloud.context.refresh.ContextRefresher.refresh(ContextRefresher.java:94) ~[spring-cloud-context-5.0.2.jar:5.0.2]
	at org.springframework.cloud.endpoint.event.RefreshEventListener.handle(RefreshEventListener.java:72) ~[spring-cloud-context-5.0.2.jar:5.0.2]
	at org.springframework.cloud.endpoint.event.RefreshEventListener.onApplicationEvent(RefreshEventListener.java:61) ~[spring-cloud-context-5.0.2.jar:5.0.2]
	at org.springframework.context.event.SimpleApplicationEventMulticaster.doInvokeListener(SimpleApplicationEventMulticaster.java:180) ~[spring-context-7.0.8.jar:7.0.8]
	at org.springframework.context.event.SimpleApplicationEventMulticaster.invokeListener(SimpleApplicationEventMulticaster.java:173) ~[spring-context-7.0.8.jar:7.0.8]
	at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:151) ~[spring-context-7.0.8.jar:7.0.8]
	at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:448) ~[spring-context-7.0.8.jar:7.0.8]
	at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:381) ~[spring-context-7.0.8.jar:7.0.8]
	at com.alibaba.cloud.nacos.configdata.NacosConfigRefreshEventListener.onApplicationEvent(NacosConfigRefreshEventListener.java:52) ~[spring-cloud-starter-alibaba-nacos-config-2025.1.0.0.jar:2025.1.0.0]
	at org.springframework.context.event.SimpleApplicationEventMulticaster.doInvokeListener(SimpleApplicationEventMulticaster.java:180) ~[spring-context-7.0.8.jar:7.0.8]
	at org.springframework.context.event.SimpleApplicationEventMulticaster.invokeListener(SimpleApplicationEventMulticaster.java:173) ~[spring-context-7.0.8.jar:7.0.8]
	at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:151) ~[spring-context-7.0.8.jar:7.0.8]
	at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:448) ~[spring-context-7.0.8.jar:7.0.8]
	at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:381) ~[spring-context-7.0.8.jar:7.0.8]
	at com.alibaba.cloud.nacos.refresh.NacosContextRefresher$1.innerReceive(NacosContextRefresher.java:131) ~[spring-alibaba-nacos-config-2025.1.0.0.jar:2025.1.0.0]
	at com.alibaba.nacos.api.config.listener.AbstractSharedListener.receiveConfigInfo(AbstractSharedListener.java:40) ~[nacos-client-3.1.1.jar:na]
	at com.alibaba.nacos.client.config.impl.CacheData$1.run(CacheData.java:462) ~[nacos-client-3.1.1.jar:na]
	at com.alibaba.nacos.client.config.impl.CacheData.safeNotifyListener(CacheData.java:505) ~[nacos-client-3.1.1.jar:na]
	at com.alibaba.nacos.client.config.impl.CacheData.checkListenerMd5(CacheData.java:345) ~[nacos-client-3.1.1.jar:na]
	at com.alibaba.nacos.client.config.impl.ClientWorker$ConfigRpcTransportClient.refreshContentAndCheck(ClientWorker.java:1035) ~[nacos-client-3.1.1.jar:na]
	at com.alibaba.nacos.client.config.impl.ClientWorker$ConfigRpcTransportClient.refreshContentAndCheck(ClientWorker.java:1016) ~[nacos-client-3.1.1.jar:na]
	at com.alibaba.nacos.client.config.impl.ClientWorker$ConfigRpcTransportClient.lambda$checkListenCache$8(ClientWorker.java:1126) ~[nacos-client-3.1.1.jar:na]
	at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:572) ~[na:na]
	at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:317) ~[na:na]
	at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144) ~[na:na]
	at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642) ~[na:na]
	at java.base/java.lang.Thread.run(Thread.java:1583) ~[na:na]
Caused by: java.lang.NoSuchMethodException: org.springframework.cloud.gateway.filter.factory.RequestRateLimiterGatewayFilterFactory.<init>()
	at java.base/java.lang.Class.getConstructor0(Class.java:3761) ~[na:na]
	at java.base/java.lang.Class.getDeclaredConstructor(Class.java:2930) ~[na:na]
	at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:138) ~[spring-beans-7.0.8.jar:7.0.8]
	... 39 common frames omitted

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions