如何在Spring Boot中将静态资源(js,css)作为ClassPathResource获取?

时间:2017-01-12 05:24:29

标签: java spring spring-boot thymeleaf static-content

我需要能够从Spring Boot Template生成PDF。为此,我正在使用PDF渲染库(FlyingSaucer),它主要是正确地完成工作。然而,有一个问题:当我有" href"页面上的标记,当PDF呈现器尝试呈现HTML时,它们无法正确解析。例如,如果我有以下代码:

<link rel="stylesheet" type="text/css" th:href="@{/css/index.css}" />

它在浏览器中正确解析,但是当我尝试使用以下代码将其作为ClassPath资源检索时:

new ClassPathResource("/css/index").getInputStream()

Spring Boot说该文件不存在。这对我来说很奇怪,因为我认为Spring Boot会将所有静态内容添加到类路径中。

下面是我的项目的文件夹结构,(我认为)遵循正确的Spring Boot对话:

Project Structure

我可以像处理浏览器请求时那样处理某些Spring资源(通过自动装配,应用程序上下文等)来解析这些URL吗?我可以通过硬编码来解决这个问题&#34; resources / static /&#34;到url字符串的开头,但我更喜欢更动态的解决方案。

2 个答案:

答案 0 :(得分:1)

使用此:

new ClassPathResource("static/css/index.css").getInputStream();

答案 1 :(得分:0)

在尝试了各种解决方案之后,我设法提出了一个,尽管Amant Simgh给出了答案,但并不要求我对任何路径进行硬编码。我在我的解决方案中抛出了一堆东西(使用图像,部署到tomcat容器,运行“bootRun”,使用webjars),它似乎适用于所有情况。

在内部,Spring Boot使用ResourceHttpRequestHandler类来解析资源。这允许Spring Boot应用程序@Autowire一个ResourceHttpRequestHandler bean。因此,为了从java代码的后端获取静态资源,您可以执行以下操作:

@Autowired
ResourceHttpRequestHandler resourceHandler;

String uri = "/css/mycss.css";
Resource resource;
for (ResourceResolver resourceResolver : resourceHandler.getResourceResolvers())
{
    resource = resourceResolver.resolveResource(null, uri, resourceHandler.getLocations(), null);
    if (resource != null)
        break;
}

这就是SpringBoot在请求静态资源时所做的事情。

重要提示:如果您的应用程序有上下文路径(即,您部署了“myapp”应用程序,那么上下文路径将是“/ myapp /”),那么您必须从上面示例中的URI中删除上下文路径。幸运的是,这可以通过以下方式轻松完成:

ServletContext context = // get servlet context somehow
String uriWithoutContext = uri.replace(context.getContextPath(), "");