无法将依赖项自动装入WebApplicationInitializer

时间:2017-09-07 16:51:54

标签: spring spring-mvc

我有一个现有的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或配置文件。 (政策,而不是我个人的决定。)

0 个答案:

没有答案