how to autowire bean in the servlet filters in spring application?

brain storm

I have a spring-boot application.

I have no ApplicationContext.xml or web.xml files in my project. I prefer to avoid them and have everything configured in Java code.

I have read the following the posts about bean injection in servlet filters.

  1. How can I get a Spring bean in a servlet filter?

  2. http://www.deadcoderising.com/2015-05-04-dependency-injection-into-filters-using-delegatingfilterproxy/

  3. spring injection in servlet filter

After reading them, I started to use DelegatingFilterProxy.

My question is how to autowire the bean into filter and avoid using xml files especially for DelegatingFilterProxy configuration.

The code snipped is available from the second post hosted in github.

public class AuditHandler {

    public void auditRequest(String appName, ServletRequest request) {
        System.out.println(appName + ": Received request from " + request.getRemoteAddr() );
    }
}

public class AuditFilter implements Filter {

    private final AuditHandler auditHandler;
    private String appName;

    public AuditFilter(AuditHandler auditHandler) {
        this.auditHandler = auditHandler;
    }

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {

        auditHandler.auditRequest(appName, request);
        chain.doFilter(request, response);
    }

    public void init(FilterConfig filterConfig) throws ServletException {
        appName = filterConfig.getInitParameter("appName");
    }

    public void destroy() {}
}

ApplicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
                           http://www.springframework.org/schema/beans/spring-beans.xsd">


    <bean id="auditHandler" class="com.deadcoderising.AuditHandler">
    </bean>

    <bean id="auditFilter" class="com.deadcoderising.AuditFilter">
        <constructor-arg ref="auditHandler"/>
    </bean>
</beans>

web.xml

<web-app version="3.0"
         xmlns="http://java.sun.com/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
         metadata-complete="true">

    <listener>
        <listener-class>
            org.springframework.web.context.ContextLoaderListener
        </listener-class>
    </listener>

    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath*:applicationContext*.xml</param-value>
    </context-param>


    <filter>
        <filter-name>auditFilter</filter-name>
        <filter-class>
            org.springframework.web.filter.DelegatingFilterProxy
        </filter-class>
        <init-param>
            <param-name>targetFilterLifecycle</param-name>
            <param-value>true</param-value>
        </init-param>
        <init-param>
            <param-name>appName</param-name>
            <param-value>di-example</param-value>
        </init-param>
    </filter>

    <filter-mapping>
        <filter-name>auditFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

</web-app>
mzc

You should add a FilterRegistrationBean to your main Application class (class annotated with @SpringBootApplication) and let Spring provide instance of the AuditHandler:

@Bean
@Autowired
public FilterRegistrationBean auditFilterRegistration(AuditHandler handler) {
    FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();
    filterRegistrationBean.setFilter(new AuditFilter(handler));
    filterRegistrationBean.setOrder(3); // ordering in the filter chain
    return filterRegistrationBean;
}

If this doesn't work (e.g. your AuditHandler implementation is not annotated properly or it's not on the default package scanning path) you can instruct Spring to provide it (also in your @SpringBootApplication annotated class):

@Bean
public AuditHandler auditHandler() {
    return new AuditHandlerImplementation();
}

Collected from the Internet

Please contact [email protected] to delete if infringement.

edited at
0

Comments

0 comments
Login to comment

Related

How to autowire a bean in other class in a Spring Boot application?

How do I manually autowire a bean with Spring?

How to Autowire Bean of generic type <T> in Spring?

How to Autowire a OkHttpClient bean in Spring Boot?

How to define which bean to autowire in Spring

Spring bean with @Autowire in superclass

Autowire Enum in Spring Bean

Spring Bean and Autowire to datasource

How to autowire one bean to another bean in spring mvc

How to @Autowire a SessionFactory to a Servlet?

How to autowire default XmlMapper in Spring Boot application

How to autowire crud repository in spring-servlet.xml?

how to autowire @bean classes

How to autowire a spring bean based on some session info

How can I @Autowire a spring bean that was created from an external jar?

Autowire a Spring bean in a Singleton class

load spring bean into a servlet

How to @autowire some bean into JsonSerializer?

How to autowire MockMvc bean correctly

How to autowire a bean inside a class that is not a configured bean?

Java Spring Boot Application: Error creating bean with name, expected at least 1 bean which qualifies as autowire candidate for this dependenc

Autowire Spring Bean into interface for default method

Unable to autowire spring bean in log appender

Autowire a bean within Spring's Java configuration

Spring autowire a stubbed service - duplicate bean

Spring: Autowire bean that does not have qualifier

Spring autowire only if bean is present as method argument

Spring: autowire bean with same type as existing class

Not able to autowire a bean using constructor in Spring