spring - 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 设置是正确的,因为我尝试将更简单的应用程序部署到实例上,效果很好。
如果我需要提供任何进一步的细节,请告诉我
解决方案
该问题与 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
}
推荐阅读
- knockout.js - 淘汰赛 - 根据表格中的选择列表选择显示复选框
- javascript - window.onerror 不适用于 Angular 5
- c# - 如何更改 HTML.GRID MVC C# 中单元格文本的文本颜色
- ajax - Woocommerce checkout ajax long delay when change of billing address
- vba - 将公式放入单元格,错误地插入值而不是公式?
- r - 秒表作为 R 的闪亮输入
- wordpress - 用于搜索的自定义 WP_Query
- php - 学生项目分配与管理系统
- java - 确定枚举的更高/最大值
- python - 在完全构造派生类之前调用派生方法?