Subodh Joshi
Subodh Joshi

Reputation: 13522

java.lang.IllegalArgumentException: Filter must not be null

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

Answers (2)

Dr BDO Adams
Dr BDO Adams

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

DingHao
DingHao

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

Related Questions