我有一个现有的Spring Web服务,其中包含web.xml
文件以及xml-config和java-config的组合。 (主要是xml配置,因为我的同事仍然认为它是2009年。)
我尝试根据属性添加动态过滤器注册。也就是说,如果设置了特定的布尔属性,则需要添加一种过滤器,如果未设置过滤器,则会添加不同的过滤器。
我试图通过实施WebApplicationInitializer
来实现这一目标。
实现如下:
@Configuration
@EnableWebMvc
@ComponentScan(basePackageClasses=Foo.class)
@PropertySource("classpath:svc.properties")
public class WebConfig implements WebApplicationInitializer {
@Value("${dev.mode:false}")
private boolean isDevMode;
@Autowired
Foo foo;
@Override
public void onStartup(ServletContext servletContext) throws ServletException {
// use the web.xml as the base
XmlWebApplicationContext appContext = new XmlWebApplicationContext();
appContext.setConfigLocation("/WEB-INF/web.xml");
if(isDevMode) {
FilterRegistration.Dynamic filterRegistration = servletContext.addFilter("jwtFilter", devModeFilter());
filterRegistration.addMappingForUrlPatterns(null,true,"/blah/*");
} else {
FilterRegistration.Dynamic filterRegistration = servletContext.addFilter("jwtFilter", jwtFilter());
filterRegistration.addMappingForUrlPatterns(null, true, "/blah/*");
}
}
@Bean
public DevModeFilter devModeFilter() {
DevModeFilter filter = new DevModeFilter(foo);
// config here
return filter;
}
@Bean
public DevModeFilter jwtFilter() {
JwtFilter filter = new JwtFilter(foo);
// config here
return filter;
}
}
过滤器注册正在运行 - 我可以将断点放入其中并且效果很好。
问题是foo
始终为null,@Value
带注释的属性始终采用默认值。 (Foo是一个bean,用@Component
注释,带有一个autowired构造函数,作为参数,是应用程序中其他地方@Bean
中声明的另一个bean的实例。)我可以将断点都放在在过滤器本身和onStartup
方法中,它们按预期触发,直到需要与foo
(始终为空)进行交互。
web.xml是正常的,否则起作用。它确实声明了spring xml配置文件的contextConfigLocation,它包含相应的<context:component-scan />
,<context:annotation-config />
,<mvc:annotation-driven />
,配置等。
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
id="FooApp" version="3.0">
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/service-base.xml</param-value>
</context-param>
<!-- listeners, servlets, and filters config'd here -->
</web-app>
如何在此处获取我的属性文件和自动连接依赖项,以便我可以动态注册(spring bean)过滤器?我意识到这可能是由于我使用了WebApplicationInitializer
,它由servlet而不是Spring管理,但是我很难找到基于Spring的替代方案。
我不允许使用Spring-Boot或配置文件。 (政策,而不是我个人的决定。)