嵌入式Jetty环境中的java Spring引导和Spring安全集成
我正试图从一个带有Spring引导和嵌入式Jetty的“fat”可执行JAR中的main()
方法初始化Spring安全性。
我在Java配置中使用Spring安全性(没有web.xml)。问题是嵌入式Jetty无法注册springSecurityFilterChain
过滤器
当我在Jetty(mvn jetty:run
)中运行与WAR相同的JAR时,它工作正常,我看到:
Initializing Spring embedded WebApplicationContext
但是在嵌入式Jetty中运行时,我没有看到任何WebApplicationContext
被初始化
我有这个{
@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
冲突。在mypom.xml
中,我有以下依赖项:
spring-boot-starter-jetty
spring-boot-starter-logging
spring-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
,但是如何使用呢
# 1 楼答案
你的设置会禁用Spring Boot来发挥它的魔力。与其自己设置容器,不如让Spring Boot来处理。只需将
JettyServerCustomizer
作为@Bean
添加到配置中即可。这将执行它,你可以做任何你需要的注册这仍然允许Spring Boot发挥其魔力,并且您已经注册了所需的额外端点
另一个解决方案是将servlet作为
ServletRegistrationBean
添加到您的配置中,然后由Spring Boot自动添加