正确使用程序化WebApplicationInitializer

时间:2018-04-18 17:09:55

标签: java spring spring-mvc spring-bean spring-config

按照javadoc中的建议调用AnnotationConfigWebApplicationContext

refresh()

NoSuchBeanDefinitionException: No qualifying bean of type 'x' 
  

Javadoc for:AnnotationConfigWebApplicationContext #register

     

请注意,必须调用AnnotationConfigWebApplicationContext.refresh()才能使上下文完全处理新类。

bean xrootContext中定义。没有调用refresh没有错误,一切都是自动装配并正确启动。

public class WebAppInitializer implements WebApplicationInitializer {

    @Override
    public void onStartup(ServletContext servletContext) throws ServletException {
        // Root context
        AnnotationConfigWebApplicationContext rootContext = new AnnotationConfigWebApplicationContext();
        rootContext.register(RootContext.class);
        rootContext.refresh();

        servletContext.addListener(new ContextLoaderListener(rootContext));

        // REST servlet
        AnnotationConfigWebApplicationContext restContext = new AnnotationConfigWebApplicationContext();
        restContext.register(RestConfig.class);
        restContext.refresh(); // <--------- Throws exception
        ServletRegistration.Dynamic restServlet = servletContext.addServlet("rest", new DispatcherServlet(restContext));
        restServlet.addMapping("/rest/");
    }
}

我是否错过了一些明智的配置?

修改

RestConfig基本上就是这样。

@Configuration
@EnableWebMvc
@ComponentScan(basePackages = "foo.bar")
public class RestConfig extends WebMvcConfigurerAdapter {
   @Autowired
   private X x;
}

编辑2:

没有证据表明在WebApplicationInitializer的javadoc中使用refresh()确实包含了一个很好的例子。

0 个答案:

没有答案