2017-06-15 224 views
0

我跑弹簧4 MVC嵌入码头9 我试图Swagger2工具插件,但我面对一个异常春Swagger2整合ServletContext的自动装配问题

Error creating bean with name 'documentationPluginsBootstrapper'

此异常的根本原因是

nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [javax.servlet.ServletContext] found for dependency [javax.servlet.ServletContext]: expected at least 1 bean which qualifies as autowire candidate for this dependency. 

这是我SwaggerConfigClass

@Configuration 
@EnableSwagger2 
public class SwaggerConfig { 
    private static final Logger logger = Logger.getLogger(SwaggerConfig.class); 

    @Bean 
    public Docket api() { 
     return new Docket(DocumentationType.SWAGGER_2) 
       .select() 
       .apis(RequestHandlerSelectors.any()) 
       .paths(PathSelectors.any()) 
       .build() 
       .apiInfo(apiInfo()); 
    } 

    private ApiInfo apiInfo() { 
     return new ApiInfoBuilder() 
       .title("TITLE") 
       .description("DESCRIPTION") 
       .version("VERSION") 
       .termsOfServiceUrl("http://terms-of-services.url") 
       .license("LICENSE") 
       .licenseUrl("http://url-to-license.com") 
       .build(); 
    } 
} 

之后,我创建的工厂类

public class ServletContextFactory implements FactoryBean<ServletContext>, 
     ServletContextAware { 
    private ServletContext servletContext; 

    @Override 
    public ServletContext getObject() throws Exception { 
     return servletContext; 
    } 

    @Override 
    public Class<?> getObjectType() { 
     return ServletContext.class; 
    } 

    @Override 
    public boolean isSingleton() { 
     return true; 
    } 

    @Override 
    public void setServletContext(ServletContext servletContext) { 
     this.servletContext = servletContext; 
    } 

} 

,然后手动把它用在重新声明豆

@Bean 
public DocumentationPluginsBootstrapper documentationPluginsBootstrapper(DocumentationPluginsManager documentationPluginsManager, 
                     List<RequestHandlerProvider> handlerProviders, 
                     DocumentationCache scanned, 
                     ApiDocumentationScanner resourceListing, 
                     TypeResolver typeResolver, 
                     Defaults defaults) throws Exception { 

    return new DocumentationPluginsBootstrapper(documentationPluginsManager, 
      handlerProviders, 
      scanned, 
      resourceListing, 
      typeResolver, 
      defaults, 
      new ServletContextFactory().getObject()); 
} 

,但仍然有一个例外(另一个异常)的NullPointerException作为下一

Failed to start bean 'documentationPluginsBootstrapper'; nested exception is java.lang.NullPointerException

那么任何人都可以提出一些解决这个自动装配问题的方法吗?

+0

您是否使用Spring Boot?如果是,请将Bean注释更改为引导程序类上的配置。 – duffymo

+0

@duffymo,我正在使用Spring MVC –

+0

Spring还是Spring Boot? – duffymo

回答

0

那么,为什么扬鞭没有启动的原因是刷新我的申请手动码头服务器开始前的WebContext。结果在Swagger初始化时,ServletContext Bean未添加到WebContext中。

1

这是你的问题:

return new DocumentationPluginsBootstrapper(documentationPluginsManager, 
    handlerProviders, 
    scanned, 
    resourceListing, 
    typeResolver, 
    defaults, 
    new ServletContextFactory().getObject()); 

春天出来的照片的那一刻,你叫new创建您ServletContextFactory。它的你的责任注入依赖到ServletContextFactory

这是新的Spring用户常见的错误。

+0

可能我错过了配置的Web应用程序,现在我无法访问ServletContext –