Issue
Why Autowired is not working inside Filter if using FilterRegistrationBean? If I comment @Bean then @Autowired works. What is going on? How should I change my code?
@Component
public class MyFilter1 extends OncePerRequestFilter {
//PROPERTIES
@Autowired MyService myService;
//===================================================================
// DO FILTER INTERNAL
//===================================================================
@Override
public void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain)
throws IOException, ServletException {
//MyService myService = new MyService();
System.out.println("myService = " + myService);
String result = myService.hello(); //Null Pointer Exception when using @Bean
System.out.println(result);
chain.doFilter(request, response);
}
//===================================================================
// FILTER REGISTRATION BEAN
//===================================================================
@Bean
public FilterRegistrationBean<MyFilter1> regFilter1(){
//CREATE REGISTRATION BEAN
FilterRegistrationBean<MyFilter1> registrationBean = new FilterRegistrationBean<>();
registrationBean.setFilter(new MyFilter1());
//RETURN REGISTRATION BEAN
return registrationBean;
}
}
Solution
When you new
up an instance of MyFilter1, you circumvent Spring so Autowiring will not work. Modify the FilterConfiguration class to look like this:
@Configuration
public class FilterConfiguration {
@Bean
public FilterRegistrationBean<MyFilter1> regFilter1(MyFilter1 myFilter){
FilterRegistrationBean<MyFilter1> registrationBean = new FilterRegistrationBean<>();
registrationBean.setFilter(myFilter);
registrationBean.addUrlPatterns("/Filtered");
registrationBean.setOrder(0);
return registrationBean;
}
}
Answered By - lane.maxwell
Answer Checked By - Candace Johnson (JavaFixing Volunteer)