【发布时间】:2014-07-12 18:06:16
【问题描述】:
我正在尝试从带有 Spring Boot 和嵌入式 Jetty 的“胖”可执行 JAR 中的 main() 方法初始化 Spring Security。
我使用带有 Java 配置的 Spring Security(没有 web.xml)。问题是嵌入式 Jetty 无法注册 springSecurityFilterChain 过滤器。
当我在 Jetty (mvn jetty:run) 中运行与 WAR 相同的 JAR 时,它运行正常,我看到了:
Initializing Spring embedded WebApplicationContext
但是在嵌入式 Jetty 中运行时,我看不到 WebApplicationContext 正在初始化。
我有这个EmbeddedServletContainerFactory:
@Bean
public EmbeddedServletContainerFactory servletContainerFactory() {
JettyEmbeddedServletContainerFactory factory = new JettyEmbeddedServletContainerFactory();
factory.setPort(8080);
factory.addServerCustomizers(new JettyServerCustomizer() {
public void customize(Server server) {
// TODO: INITIALIZE SPRING SECURITY SOMEHOW...
}
});
return factory;
}
我尝试创建AbstractSecurityWebApplicationInitializer 的子类,但它与我的SpringBootServletInitializer 冲突。在我的pom.xml 中,我有这些依赖项:
spring-boot-starter-jettyspring-boot-starter-loggingspring-boot-starter
当我添加 spring-boot-web 时,它会抛出:
java.lang.IllegalArgumentException: A ServletContext is required to configure default servlet handling
我还尝试向 Jetty 注册 DelegatingFilterProxy,但随后它抛出:
java.lang.IllegalStateException: No WebApplicationContext found: no ContextLoaderListener registered?
我猜我需要告诉 Jetty 使用 WebApplicationContext,但是如何?
【问题讨论】:
-
为什么不创建一个带有 main 方法的类来运行您的应用程序? Spring Boot 将为您完成设置。请参阅spring.io/guides/gs/securing-web 和 next 将 jar 转换为战争 spring.io/guides/gs/convert-jar-to-war
-
我正在这样做——正如 Spring Boot 文档所建议的那样。我只需要从
main()初始化 Spring Security。 -
SPring boot 将执行此操作以及引导 Jetty 容器。我不明白你为什么要自己创建一个容器,因为 spring boot 为你做了所有这些......
-
我使用
ServletContainer来启动 JerseyResourceConfig类。 -
仍然不明白为什么你需要自己做,创建一个
JettyServerCustomizer在你的上下文中注册它作为一个bean,spring boot 会为你应用它。端口等都将由 Spring Boot 设置。您还可以将配置注册为ServletBean,以便 Spring Boot 注册它。
标签: java spring-security embedded-jetty spring-boot