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

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

    }

最佳答案

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

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

    }
}

关于java - 如何在 Spring Boot 中为嵌入式 Jetty 设置 Handler?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38051624/

相关文章:

java - 如何在 Android 中的 ExpandableListView 中禁用子分隔符

java - Java Eclipse 内存不足

java - 将 Groovy 动态方法添加到 Spring Controller

java - 如何从java获取spring配置文件名称

java - 未找到 org.springframework.web.servlet.mvc.SimpleFormController

java - UTF-8 不会在 Hibernate + MySQL 上持续存在

java - 为什么 java 接口(interface)返回自身 <java.nio.file.Path>

java - 我可以在没有 Spring AppContext 的情况下手动加载 @ConfigurationProperties 吗?

spring - Spring Boot Elasticsearch

java - 将模型列表转换为json格式