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

Dar*_*arz 4 java spring jetty spring-mvc

我可以在标准 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
   }
}
Run Code Online (Sandbox Code Playgroud)

如何以与带有嵌入式 Jetty 的 Spring Boot 类似的方式设置 Handler?当我尝试使用EmbeddedServletContainerCustomizerbean 时,我遇到了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()));
            }
        };

    }
Run Code Online (Sandbox Code Playgroud)

Dar*_*arz 6

好的,我可以通过以下代码实现这一点。如果这不是最佳实践,请告诉我。

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

    }
}
Run Code Online (Sandbox Code Playgroud)