【问题标题】:Spring Boot throws 404 when serving static HTML from custom static location从自定义静态位置提供静态 HTML 时,Spring Boot 抛出 404
【发布时间】:2016-05-28 11:06:51
【问题描述】:

我是 Spring Boot 的新手,并且已经阅读了他们的文档以及几篇文章,并且很难为单个静态 HTML 页面提供服务。我认为让事情变得复杂的是,我有两个无法满足的要求,而且我认为这些文档或这些文章不能满足我的要求:

  1. 我想使用 YAML 进行外部配置(所以application.yml);和
  2. 我实际上希望我的外部配置是 external!也就是说,我希望它打包在我的 uberjar 中,而是希望它与 uberjar 一起部署,作为一个解耦的工件。这使我可以在部署了配置文件的任何环境中运行相同的 uberjar。

首先,我在我的编译类路径中添加了所有常用的 Starter POM(提到这一点,很明显 Snake YAML应该在我的类路径中):

compile(
    'org.codehaus.groovy:groovy-all:2.4.6'
    ,'org.springframework.boot:spring-boot-starter-jetty'
    ,'org.springframework.boot:spring-boot-starter-actuator'
)
compile('org.springframework.boot:spring-boot-starter-web') {
    exclude module: 'spring-boot-starter-tomcat'
}

接下来,我将src/main/resources/webapps/test.html 添加到我的源代码中:

<html>
    <head>
        <title>Test</title>
    </head>
    <body>
        This is a simple test!
    </body>
</html>

接下来,我将application.yml 添加到我的项目的根目录中:

spring:
  resources:
    static-locations:
      - 'classpath:/webapps/'

这个想法是让 Spring Boot 在本地运行时在根目录中找到此文件,但 CI 服务器能够在 uberjar 旁边部署任意(特定于环境的)application.yml

然后我构建我的 uberjar:

./gradlew build

现在我运行我的 uberjar,传入一个命令行参数,它应该告诉 Spring 在哪里找到我的配置文件:

java -Dspring.config.location=. -jar build/libs/myapp.jar

我指定“.”是因为 Gradle 用完了项目的根目录,这也是 application.yml 所在的位置。

应用程序启动得很好,当我转到http://localhost:8080 时,我看到了我通常看到的内容(我有一个@RestController/ 映射到一个简单的“Hello, Spring Boot”字符串)。 但是,当我转到 http://localhost:8080/test.html 时,我得到了 404。

有什么想法会出错吗?

【问题讨论】:

  • 你能告诉你的控制器/test映射到哪里吗?
  • 通常当你使用休息时你没有像localhost:8080/test.html这样的路径你只有localhost:8080/test。您的映射是如何配置的?你能提供“WebMvcAutoConfiguration”吗?

标签: spring spring-boot yaml


【解决方案1】:

src/main/resources 文件夹被 Spring Boot 自动配置自动添加为静态资源根目录。这意味着其中的所有文件夹都会自动拾取 - 您无需显式添加您的 webapps 文件夹。

我刚刚通过将test.html 放入/main/resources/lestatic/ 文件夹中进行了本地尝试:http://localhost:8080/test.html 在没有额外配置的情况下完美运行,并且当classpath:/lestatic/ 被指定为资源配置时失败并出现 404。

如果这不起作用,您应该检查您的resources 文件夹是否实际上包含在您的构建工具中作为资源根目录。完成构建后,您可以通过检查 target/classes 文件夹中是否存在您的自定义文件夹来验证这一点。

看到这个Spring Boot manual

【讨论】:

  • 谢谢@Yuri (+1) - 如果您不介意,请提出两个简单的问题:(1) 上面是不是打错字了?你的意思是说/main/resources/static,还是我真的应该把test.html 放到/main/resources/**lestatic**/ 中?感谢您的任何澄清! (2) 当你说“...并且当classpath:/webapps/ 被指定为资源配置时出现 404 失败...”你能解释一下你所说的“资源配置”?我只是不明白你的意思!再次感谢!
  • (1) 您可以将您的test.html 放入位于src/main/resources 文件夹内的任何文件夹中
  • (2) by resource config 我的意思是你配置静态资源的 YAML 配置部分(或 .properties,如果你喜欢的话)
  • 抱歉,我的回答中有错字:404 当classpath:/lestatic/ 被指定为资源配置时。
  • 再次感谢@Yuriy(所有 cmets +1)-最后一个问题(我保证!)。如果您将classpath:/lestatic/ 指定为资源配置,那为什么会导致http://localhost:8080/test.html 抛出404s?再次感谢!
【解决方案2】:
  1. 把你的test.html放到src/main/resources/static/test.html
  2. 享受吧! http://localhost:8080/test.html

PS。 @RestController 也将继续工作。

【讨论】:

    【解决方案3】:

    tldr;

    Sample Application - GitHub

    gradle build
    java -Dspring.profiles.active=local -jar build/libs/stackoverflow-q37498214.jar
    

    java -Dspring.profiles.active=production -jar build/libs/stackoverflow-q37498214.jar
    

    配置文件特定属性

    Spring Boot 通过 ${SPRING_PROFILES_ACTIVE} 环境变量支持特定环境的配置。

    如果你设置 this = local 然后提供一个名为 application-local.yml 的配置文件,那么您的 Spring Boot 应用程序将使用该环境特定的配置。

    您也可以通过命令行设置:

    java -Dspring.profiles.active=local -jar build/libs/app.jar
    

    看看上面的示例应用程序,看看它的实际效果。


    但为什么是 404?

    您的自定义配置路径 (-Dspring.config.location=.) 似乎没有被拾取。因此,您的自定义静态位置 (classpath:/webapps/) 未注册,因此您的网络服务器未提供服务。


    如果上述解决方案对您不起作用,那么我会要求您发布一个完整的示例项目,以便我们进行更深入的研究。此外,您的构建过程的详细信息,以及您提供生产配置文件的方式/时间。

    【讨论】:

      猜你喜欢
      • 2017-07-12
      • 2016-07-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-21
      • 2016-05-04
      • 2019-07-11
      相关资源
      最近更新 更多