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:
- Both classes should provide a default no-arg constructor so they can be instantiated by
ConfigurationPropertiesRebinder, or
- 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
Describe the bug
When Spring Cloud configuration refresh is triggered (e.g., via Consul, Nacos, or any config source),
ConfigurationPropertiesRebinderiterates over all@ConfigurationPropertiesbeans and tries to reset them by creating new instances via reflection. BothRedisRateLimiterandRequestRateLimiterGatewayFilterFactoryare annotated with@ConfigurationProperties, but neither class has a default no-arg constructor. This causesBeanInstantiationException/NoSuchMethodExceptionduring the rebind process, emitting WARN logs: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
Root Cause
RedisRateLimiterandRequestRateLimiterGatewayFilterFactoryare@ConfigurationPropertiesbeans without a default no-arg constructor. WhenConfigurationPropertiesRebinder.resetBeanToDefaults()(in spring-cloud-commons) tries to callBeanUtils.instantiateClass()on them during aRefreshEvent, it fails becauseClass.getDeclaredConstructor()cannot find<init>().Expected Behavior
Either:
ConfigurationPropertiesRebinder, or@ConfigurationPropertiesrebinding.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