如何在Spring Boot中为嵌入式Jetty设置Handler?

时间:2016-06-27 10:29:26

标签: java spring spring-mvc jetty

我能够在标准Java应用程序中轻松设置Jetty的处理程序,如下所示:

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
   }
}

如何使用嵌入式Jetty的Spring Boot以类似的方式设置Handler?当我尝试使用EmbeddedServletContainerCustomizer bean时,我得到missing ServletContext例外。

@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()));
            }
        };

    }

1 个答案:

答案 0 :(得分:3)

好的,我能够通过以下代码实现这一目标。如果这不是最佳做法,请告诉我。

@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);
                });
            }
        };

    }
}