IllegalArgumentException:需要ServletContext

时间:2015-07-10 13:10:30

标签: java spring spring-mvc tomcat spring-boot

无法让我的Spring启动应用程序在AWS实例上运行。它在我的机器上工作正常但看起来自动装配在一个环境中正确解析但在另一个环境中没有解决。看起来我需要稍微清理配置类。任何想法在这里?非常感谢。

 **Main class:**

@Configuration
@EnableAutoConfiguration
@EnableConfigurationProperties
@ComponentScan
public class Data {



public static void main(String[] args) throws Exception {
    SpringApplication.run(Data.class, args);

}
   }

配置

     @EnableWebMvc
     @Configuration

    public class AquilaDataWebConfig extends WebMvcConfigurerAdapter {

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/charts/**").addResourceLocations(
            "file:///var/lib/aquila/");
        registry.addResourceHandler("/**").addResourceLocations(
                "classpath:/static/");
    }

    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        registry.addViewController("/").setViewName("forward:/index.html");
    }

    @Bean
    public InternalResourceViewResolver defaultViewResolver() {
        // Need this so we can forward to index.html.
        return new InternalResourceViewResolver();
    }
}

例外:

Error starting ApplicationContext. To display the auto-configuration report enabled debug logging (start with --debug)


2015-07-09 19:30:55.773 ERROR 18723 [main] --- o.s.boot.SpringApplication               : Application startup failed

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'defaultServletHandlerMapping' defined in class path resource [org/springframework/web/servlet/config/annotation/DelegatingWebMvcConfiguration.class]: Instantiation of bean failed; nested exception is org.springframework.beans.factory.BeanDefinitionStoreException: Factory method [public org.springframework.web.servlet.HandlerMapping org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport.defaultServletHandlerMapping()] threw exception; nested exception is java.lang.IllegalArgumentException: A ServletContext is required to configure default servlet handling
    at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:601)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1113)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1008)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:505)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:476)
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:302)
    at 

3 个答案:

答案 0 :(得分:4)

application.properties(或application.yml)中,确保spring.main.web-environment未设置为false。这应该可以解决缺少的servlet上下文问题。

答案 1 :(得分:0)

我假设您的包中有其他@Configuration,它由@ComponentScan选择(您的异常中出现的DelegatingWebMvcConfiguration很可能是由@EnableWebMvc在外部@Configuration中的某处导入的。)

可能的解决方案是在组件扫描中使用过滤器。

@ComponentScan( excludeFilters = { @Filter(type = FilterType.ANNOTATION, value = Configuration.class) })

如果可能,请在basePackages = { "org.yourpackage" }

中添加@ComponentScan

如果可能,也尝试包括更好的性能

@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
    configurer.enable();
}

它告诉Spring对某些请求使用容器的默认servlet,比如静态资源。

答案 2 :(得分:0)

您可以使用Spring Cloud

       <dependencies> 
    <dependency>
 <groupId>org.springframework.cloud</groupId> 

    <artifactId>spring-cloud-aws-autoconfigure</artifactId>
     <version>{spring-cloud-version}</version> 
    </dependency>
    </dependencies>

Spring Cloud AWS还提供专用的Spring Boot支持。可以使用Spring Boot属性配置Spring Cloud AWS,并且还可以根据常规设置自动猜测任何合理的配置。

此处还有一个example,它使用Elastic Beanstalk在AWS上部署。

War变体和Jar变体之间存在两个差异。 War变体不需要嵌入式tomcat,因为它将部署在tomcat服务器中,因此pom.xml将spring-boot-starter-tomcat依赖项设置为“provided”。 Jar变体删除了范围标记,以在jar中包含此依赖项。

org.springframework.boot    spring-boot-starter-tomcat  provided 

第二个区别是ServletInitializer

  public class ServletInitializer extends SpringBootServletInitializer { 
@Override   protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        return application.sources(SpringBootAwsApplication.class);     
} }

现在您已创建此应用程序,我们需要生成war文件以部署到Amazon AWS上。右键单击pom.xml并选择Run As-&gt; Maven Install。这将运行构建并在应用程序的目标文件夹中创建war文件。

使用Amazon Elastic Beanstalk部署您的应用程序

1)登录Amazon AWS。 2)在主控制面板中选择部署和扩展下的Elastic Beanstalk。管理。 3)单击右上角的“创建应用程序”。 4)输入应用程序名称,然后单击下一步。 5)环境层 - Web服务器 6)预定义配置 - Tomcat 7)环境类型 - 单个实例 8)单击“下一步” 9)选择上传您自己的,单击浏览并找到您之前创建的战争。 10)上传应用程序后,您将看到下一页,您可以在其中选择URL。 11)输入名称并单击检查可用性以查看是否可以使用它。 12)单击“下一步” 13)我们在此示例中不需要RDB,因此请单击此处的下一步。 14)在下一步中,您将定义将要创建的EC2实例,如果您使用免费试用,则坚持使用免费的t1.micro实例类型。 15)EC2密钥对,可以不被选中。你现在不需要它,很可能你还没有配置它。这将在稍后的文章中介绍。 16)单击“下一步”。 17)在环境标签中再次点击下一步,因为我们不关心这一点。 18)查看配置,然后单击“启动”。