首页 > 解决方案 > Amazon Web Services - 部署 Spring Boot 应用程序

问题描述

我有一个要部署到 EB(Elastic Beanstalk)AWS 上的 Spring Boot 应用程序。该应用程序在本地运行良好,但是,我尝试在已部署版本上访问的所有页面上都得到 404。另外,我也无法访问静态文件夹下的任何静态内容。所有 REST 端点都可以正常工作。

我的项目结构如下

-- src
  -- main
     -- kotlin
     -- resources
        -- static
           -- css
           -- fonts
           -- images
           -- js
        -- templates (contains html files)

我尝试在 .ebextensions 文件夹下的 .config 文件中定义 option_settings

option_settings
  aws:elasticbeanstalk:container:java:staticfiles: 
    /public/: WEB-INF/classes/static
    /static/: WEB-INF/classes/staticenter code here

我还尝试将以下内容添加到我的 spring 配置类中

@Configuration open class MvcConfig : WebMvcConfigurerAdapter() {

override fun addViewControllers(registry: ViewControllerRegistry) {
    registry.addViewController("/").setViewName("homepage")
    registry.addViewController("/index").setViewName("homepage")
    registry.addViewController("/home").setViewName("homepage")
    registry.addViewController("/homepage").setViewName("homepage")
    registry.addViewController("/login").setViewName("login")
    registry.addViewController("/products").setViewName("productsList")
    registry.addViewController("/productdetail").setViewName("productDetail")
}

@Bean
open fun viewResolver(): ViewResolver {
    val bean = InternalResourceViewResolver()

    bean.setPrefix("/templates/")
    bean.setSuffix(".html")

    return bean
}

override fun addResourceHandlers(registry: ResourceHandlerRegistry?) {
    // Register resource handler for all static folders
    registry!!.addResourceHandler("/resources/**").addResourceLocations("classpath:/statics/")
            .setCacheControl(CacheControl.maxAge(2, TimeUnit.HOURS).cachePublic())
}

@Bean
open fun errorPageFilter(): ErrorPageFilter {
    return ErrorPageFilter()
}

@Bean
open fun disableSpringBootErrorFilter(filter: ErrorPageFilter): FilterRegistrationBean {
    val filterRegistrationBean = FilterRegistrationBean()
    filterRegistrationBean.filter = filter
    filterRegistrationBean.isEnabled = false
    return filterRegistrationBean
}

我正在部署到位于 Apache 代理服务器后面的 tomcat8 上。

我的 EB 设置是正确的,因为我尝试将更简单的应用程序部署到实例上,效果很好。

如果我需要提供任何进一步的细节,请告诉我

标签: springmavenamazon-web-servicesspring-bootkotlin

解决方案


该问题与 resourceHandler 有关,它自己的类路径从未添加到资源处理程序中,即使 servlet 日志记录表明它是。

Spring 默认映射以下路径

classpath:META-INF/resources/
classpath:resources/
classpath:static/
classpath:public/

需要将 /** 添加到映射中。解决方案是将代码修改为以下

override fun addResourceHandlers(registry: ResourceHandlerRegistry?) {
    registry!!.addResourceHandler("/**", "/static/**")
              .addResourceLocations("classpath:/templates/", "classpath:/static/").setCacheControl(CacheControl.maxAge(2,TimeUnit.HOURS).cachePublic())
}

@Bean
open fun viewResolver(): ViewResolver {
    val bean = InternalResourceViewResolver()
    bean.setSuffix(".html")
    return bean
}

推荐阅读