Reputation: 13522
With Springboot update from 2.7.2 to 3.2.0 ,now Filter class started throwing exception
Caused by: org.springframework.boot.web.server.WebServerException: Unable to start embedded Tomcat at org.springframework.boot.web.embedded.tomcat.TomcatWebServer.initialize(TomcatWebServer.java:142) at org.springframework.boot.web.embedded.tomcat.TomcatWebServer.(TomcatWebServer.java:104) at org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory.getTomcatWebServer(TomcatServletWebServerFactory.java:501) at org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory.getWebServer(TomcatServletWebServerFactory.java:218) at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.createWebServer(ServletWebServerApplicationContext.java:188) at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.onRefresh(ServletWebServerApplicationContext.java:162) ... 11 common frames omitted Caused by: java.lang.IllegalArgumentException: Filter must not be null at org.springframework.util.Assert.notNull(Assert.java:172) at org.springframework.boot.web.servlet.AbstractFilterRegistrationBean.getDescription(AbstractFilterRegistrationBean.java:223) at org.springframework.boot.web.servlet.RegistrationBean.onStartup(RegistrationBean.java:47) at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.selfInitialize(ServletWebServerApplicationContext.java:241) at org.springframework.boot.web.embedded.tomcat.TomcatStarter.onStartup(TomcatStarter.java:52) at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:4850) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:171) at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1332) at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1322) at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264) at org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:75) at java.base/java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:145) at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:866) at org.apache.catalina.core.StandardHost.startInternal(StandardHost.java:845) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:171) at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1332) at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1322) at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264) at org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:75) at java.base/java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:145) at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:866) at org.apache.catalina.core.StandardEngine.startInternal(StandardEngine.java:240) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:171) at org.apache.catalina.core.StandardService.startInternal(StandardService.java:433) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:171) at org.apache.catalina.core.StandardServer.startInternal(StandardServer.java:917) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:171) at org.apache.catalina.startup.Tomcat.start(Tomcat.java:488) at org.springframework.boot.web.embedded.tomcat.TomcatWebServer.initialize(TomcatWebServer.java:123) ... 16 common frames omitted
The code which look like throwing exception
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
@Value("${system.debug.enabled:false}")
private boolean debugEnabled;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(httpHeaderInterceptor());
}
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/log/**").allowedOrigins("*")
.allowedMethods("POST", "GET", "PUT", "PATCH", "OPTIONS", "DELETE")
.allowedHeaders("header1", "header2", "header3")
.allowedHeaders("Origin", "Authorization", "X-Requested-With", "Content-Type", "Accept")
.allowCredentials(false).maxAge(3600);
}
@Bean
public HandlerInterceptor httpHeaderInterceptor() {
return (HandlerInterceptor) new HttpHeaderInterceptor();
}
private FilterRegistrationBean newFilterRegistrationBean(Filter filter, int order) {
final FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();
filterRegistrationBean.setOrder(order);
filterRegistrationBean.addUrlPatterns("/*");
return filterRegistrationBean;
}
@Bean
public FilterRegistrationBean stopWatchFilter() {
Filter filter = debugEnabled ? new StopWatchFilter() : new NoopFilter();
FilterRegistrationBean filterRegistrationBean = newFilterRegistrationBean(filter, 1);
return filterRegistrationBean;
}
@Bean
public FilterRegistrationBean gzipFilter() {
GZipRequestFilter gzipRequestFilter = new GZipRequestFilter();
return newFilterRegistrationBean(gzipRequestFilter, 2);
}
@Bean
public FilterRegistrationBean registerOpenSessionInViewFilterBean() {
OpenEntityManagerInViewFilter openEntityManagerInViewFilter = new OpenEntityManagerInViewFilter();
return newFilterRegistrationBean(openEntityManagerInViewFilter, 1);
}
}
As per my understanding this throwing exception
@Bean
public FilterRegistrationBean gzipFilter() {
GZipRequestFilter gzipRequestFilter = new GZipRequestFilter();
return newFilterRegistrationBean(gzipRequestFilter, 2);
}
@Bean
public FilterRegistrationBean registerOpenSessionInViewFilterBean() {
OpenEntityManagerInViewFilter openEntityManagerInViewFilter = new OpenEntityManagerInViewFilter();
return newFilterRegistrationBean(openEntityManagerInViewFilter, 1);
}
But the place class is initializing but still its telling NULL
. After removing this code its starting server.
Upvotes: 0
Views: 825
Reputation: 405
I had this problem, I had a left over filter registration bean with the filter commented out, either delete the bean or include the filter
public FilterRegistrationBean someFilterRegistration() {
FilterRegistrationBean registration = new FilterRegistrationBean();
//registration.setFilter(majoranaCustomAPISecurityFilter);
registration.addUrlPatterns("/url/*");
registration.addInitParameter("paramName", "paramValue");
registration.setName("MajoranaCustomAPISecurityFilter");
registration.setOrder(1);
return registration;
}
Upvotes: 0
Reputation: 1248
You need to pass the filter parameter to FilterRegistrationBean constructor as below
private FilterRegistrationBean newFilterRegistrationBean(Filter filter, int order) {
final FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(filter);
filterRegistrationBean.setOrder(order);
filterRegistrationBean.addUrlPatterns("/*");
return filterRegistrationBean;
}
Upvotes: 0