我可以使用spring-boot-starter-tomcat但不使用spring-boot-starter-web来提供静态内容吗?

时间:2017-04-20 22:03:12

标签: spring-mvc tomcat spring-boot jersey-2.0

我正在使用spring-boot-starter-jerseyspring-boot-starter-tomcat(v.1.5.2)处理网络服务,因此,我宁愿不添加spring-boot-starter-web,这进一步使我的配置复杂化。我想将Swagger UI静态文件粘贴在一个文件夹中并从那里提供它们。

我想知道的是,我可以仅使用spring-boot-starter-tomcat提供静态文件吗?我找到了Spring documentation saying that I can server static content from a variety of sources on the classpath,但我发现的例子似乎需要Spring MVC。我已经尝试禁用Jersey并在src/main/resources/static中放置静态文件来测试Tomcat,但是当我转到localhost / index.html时,我得到404找不到错误。

正如你可能从我的道路上讲,我正在使用Maven。

由于您可以仅使用Tomcat提供静态文件,因此我似乎应该可以使用spring-boot-starter-tomcat提供静态文件。如果是这种情况,我在哪里放这些文件?

换句话说,我已经开始使用Spring-provided spring-boot-sample-jersey project了。我要求Jersey Web服务应答根地址(/)。我如何添加一些静态内容(HTML,CSS,JS)从名为/ swagger的子目录中提供?

1 个答案:

答案 0 :(得分:1)

因此默认注册默认servlet(提供静态内容)。但它只使用搜索特定路径作为文档根。我不得不将源代码挖掘到finally find it。如果你查看AbstractEmbeddedServletContainerFactory,就会看到

private static final String[] COMMON_DOC_ROOTS = {
        "src/main/webapp", "public", "static" };

如果我们没有明确设置文档根目录,则以上三个是要搜索的路径。按顺序,找到的第一个目录将用作文档根目录。我已经验证了所有这些工作。

如果要设置其他目录,可以使用自定义程序bean

@Bean
public EmbeddedServletContainerCustomizer tomcatCustomizer() {
    return new EmbeddedServletContainerCustomizer() {
        @Override
        public void customize(ConfigurableEmbeddedServletContainer container) {
            container.setDocumentRoot(new File("src/main/resources/static"));
        }
    };
}

我还没想到的一件事是,我们是否可以将文件作为类路径资源而不是文件系统资源来提供。如果你查看我链接的源代码,它有一些代码可以查找是否存在META-INF/resources。我认为这可能有用,但不幸的是它对我来说并不适用。也许Spring Boot团队的一些人可以启发我们。