Recently I had this issue while migrating one Spring Cloud application to a newer version of everything - cloud version to Hoxton.SR3, boot to 2.2.6 and Java from 1.8.0.211 to 13.0.2. My Gateway app was not able to start and I had an exception log on my console.
The error log was the following:
reactor.core.Exceptions$ErrorCallbackNotImplemented: java.lang.UnsupportedOperationException: getConfigClass() not implemented
Caused by: java.lang.UnsupportedOperationException: getConfigClass() not implemented
at org.springframework.cloud.gateway.filter.factory.GatewayFilterFactory.getConfigClass(GatewayFilterFactory.java:58) ~[spring-cloud-gateway-core-2.2.2.RELEASE.jar:2.2.2.RELEASE]
at org.springframework.cloud.gateway.support.ConfigurationService$ConfigurableBuilder.doBind(ConfigurationService.java:187) ~[spring-cloud-gateway-core-2.2.2.RELEASE.jar:2.2.2.RELEASE]
at org.springframework.cloud.gateway.support.ConfigurationService$AbstractBuilder.bind(ConfigurationService.java:286) ~[spring-cloud-gateway-core-2.2.2.RELEASE.jar:2.2.2.RELEASE]
............
After investigation, I found out that after the Spring Cloud update it's required for my custom filter class to implement the getConfigClass() method from the GatewayFilterFactory interface, even though it wasn't necessary before. I didn't have any compilation error, it just crashed in runtime. So, if you had issues with this error, just override the method getConfigClass():
import java.util.Base64;
import org.springframework.cloud.gateway.filter.GatewayFilter;
import org.springframework.cloud.gateway.filter.factory.GatewayFilterFactory;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.stereotype.Component;
@Component
public class UploadRouteFilter implements GatewayFilterFactory<UploadRouteFilter.Config> {
@Override
public GatewayFilter apply(Config config) {
return ((exchange, chain) -> {
// your custom filter code here
});
}
@Override
public Class<Config> getConfigClass() {
return Config.class;
}
@Override
public Config newConfig() {
Config c = new Config();
return c;
}
public static class Config {
}
}