title: How to set up filter chain in spring boot?
body: <p>I have come across spring-boot and intend to add a filter chain for incoming request.</p>
  
  <p>Here is the Application:</p>
  
  <pre><code>package example.hello;
  
  import org.springframework.boot.SpringApplication;
  import org.springframework.boot.autoconfigure.SpringBootApplication;
  import org.springframework.context.ApplicationContext;
  
  @SpringBootApplication
  public class Application {
  
      public static void main(String[] args) {
          ApplicationContext ctx = SpringApplication.run(Application.class, args);
      }
  
  }
  </code></pre>
  
  <p>Here is the Controller:</p>
  
  <pre><code>package example.hello;
  
  import org.springframework.web.bind.annotation.RequestMapping;
  import org.springframework.web.bind.annotation.RequestParam;
  import org.springframework.web.bind.annotation.RestController;
  
  import java.util.concurrent.atomic.AtomicLong;
  
  @RestController
  public class GreetingController {
  
      private static final String template = "Hello, %s!";
      private final AtomicLong counter = new AtomicLong();
  
      @RequestMapping("/greeting")
      public Greeting greeting(@RequestParam(value="name", defaultValue="World") String name) {
          return new Greeting(counter.incrementAndGet(),
                  String.format(template, name));
      }
  }
  </code></pre>
  
  <p>Here is the Filter Config:</p>
  
  <pre><code>package example.hello;
  
  import org.springframework.boot.context.embedded.FilterRegistrationBean;
  import org.springframework.context.annotation.Bean;
  import org.springframework.context.annotation.Configuration;
  
  @Configuration
  public class WebConfig {
  
      @Bean
      public FilterRegistrationBean greetingFilterRegistrationBean() {
          FilterRegistrationBean registrationBean = new FilterRegistrationBean();
          registrationBean.setName("greeting");
          GreetingFilter greetingFilter = new GreetingFilter();
          registrationBean.setFilter(greetingFilter);
          registrationBean.setOrder(1);
          return registrationBean;
      }
  
      @Bean
      public FilterRegistrationBean helloFilterRegistrationBean() {
          FilterRegistrationBean registrationBean = new FilterRegistrationBean();
          registrationBean.setName("hello");
          HelloFilter helloFilter = new HelloFilter();
          registrationBean.setFilter(helloFilter);
          registrationBean.setOrder(2);
          return registrationBean;
      }
  
  }
  </code></pre>
  
  <p>Here is the HelloFilter and Greeting Filter:</p>
  
  <pre><code>package example.hello;
  
  import javax.servlet.*;
  import java.io.IOException;
  
  public class HelloFilter implements Filter {
      @Override
      public void init(FilterConfig filterConfig) throws ServletException {
  
      }
  
      @Override
      public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
          System.out.println("HelloFilter!");
      }
  
      @Override
      public void destroy() {
  
      }
  }
  
  package example.hello;
  
  import javax.servlet.*;
  import java.io.IOException;
  
  public class GreetingFilter implements Filter {
      @Override
      public void init(FilterConfig filterConfig) throws ServletException {
  
      }
  
      @Override
      public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
          System.out.println("Greetings from filter!");
      }
  
      @Override
      public void destroy() {
  
      }
  }
  </code></pre>
  
  <p>When I start the application and run <code>curl localhost:8080/greeting</code>, Only "Greetings from filter" is received and the <code>HelloFilter</code> is not invoked.</p>
  
  <p>Besides there is no response from <code>Greeting Controller</code>. It seems that the <code>GreetingFilter</code> blocks the procedure.</p>
  
  <p>So how to set the filter chain in Spring boot. Are there any bugs in the code above?</p>