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