Dariusz Mydlarz
Dariusz Mydlarz

Reputation: 3002

How to set Handler for embedded Jetty in Spring Boot?

I am able to easily set handler for Jetty in a standard Java application like this:

public class Main {
   public static void main(String[] args) throws Exception {
       Main main = new Main();
       main.start();
   }

   private void start() throws Exception {
       Server server = new Server(9999);
       server.setHandler(new Handler());
       server.start();
       server.join();
   }
}

class Handler extends AbstractHandler {
   @Override
   public void handle(final String target, final Request baseRequest, final HttpServletRequest request, final HttpServletResponse response) throws IOException, ServletException {
       // do something
   }
}

How to set Handler similar way with Spring Boot with embedded Jetty? When I am trying with EmbeddedServletContainerCustomizer bean I am getting missing ServletContext exception.

@Bean
    public EmbeddedServletContainerCustomizer customizer() throws MalformedURLException {
        return new EmbeddedServletContainerCustomizer() {

            @Override
            public void customize(ConfigurableEmbeddedServletContainer container) {
                if (container instanceof JettyEmbeddedServletContainerFactory) {
                    customizeJetty((JettyEmbeddedServletContainerFactory) container);
                }
            }

            private void customizeJetty(JettyEmbeddedServletContainerFactory jetty) {
                jetty.addServerCustomizers((JettyServerCustomizer) server -> server.setHandler(myCustomHandler()));
            }
        };

    }

Upvotes: 4

Views: 2961

Answers (1)

Dariusz Mydlarz
Dariusz Mydlarz

Reputation: 3002

Ok, I was able to achieve that with following code. If it's not a best practice, please let me know.

@Configuration
@EnableWebMvc
@SpringBootApplication
public class Main {

    public static void main(String[] args) {
        new SpringApplicationBuilder()
                .sources(Main.class)
                .run(args);
    }

    @Bean
    public EmbeddedServletContainerCustomizer customizer() throws MalformedURLException {

        return new EmbeddedServletContainerCustomizer() {

            @Override
            public void customize(ConfigurableEmbeddedServletContainer container) {
                if (container instanceof JettyEmbeddedServletContainerFactory) {
                    customizeJetty((JettyEmbeddedServletContainerFactory) container);
                }
            }

            private void customizeJetty(JettyEmbeddedServletContainerFactory jetty) {
                jetty.addServerCustomizers((JettyServerCustomizer) server -> {
                    HandlerCollection handlerCollection = new HandlerCollection();
                    handlerCollection.setHandlers(new Handler[]{ myCustomHandler(), server.getHandler() });
                    server.setHandler(handlerCollection);
                });
            }
        };

    }
}

Upvotes: 6

Related Questions