2017-01-12 18 views
0

У меня есть требование, чтобы иметь возможность создавать PDF-файлы из шаблона Spring Boot. Для этого я использую библиотеку рендеринга PDF (FlyingSaucer), которая в основном выполняет задание правильно. Однако есть одна проблема: когда у меня есть теги «href» на странице, они не корректно решают, когда рендеринг PDF пытается отобразить HTML. Например, если у меня есть следующий код:Как получить статический ресурс (js, css) как ClassPathResource в Spring Boot?

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

Это правильно решает в браузере, но когда я пытаюсь получить это в качестве пути к классам ресурса, используя следующий код:

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

Spring Загрузочный говорит что файл не существует. Это странно для меня, поскольку я думал, что Spring Boot добавляет весь статический контент в путь к классам.

Ниже представлена ​​структура папок моего проекта, который (я думаю), следует правильно Spring загрузочную convetion:

Project Structure

Могу ли я получить ручку на какой-Спринг ресурс (через автоматического связывания, контекст приложения и т. д.), чтобы разрешить эти URL-адреса так же, как и в случае, когда браузер запрашивает их? Я мог бы обойти это с помощью hardcoding «resources/static /» до начала строки url, но я бы предпочел более динамичное решение.

ответ

0

Перепробовав различные решения, мне удалось придумать один, что, несмотря на ответ дается Амант Simgh, не требует, чтобы я жёстко любые пути. Я бросил кучу вещей в мое решение (используя изображения, развернувшись в контейнере tomcat, запуская «bootRun», используя webjars), и, похоже, он работал в каждом случае.

Внутри, Spring Boot использует класс ResourceHttpRequestHandler для разрешения ресурсов. Это позволяет приложениям Spring Boot для @Autowire компонента ResourceHttpRequestHandler. Итак, для того, чтобы получить статический ресурс из внутреннего интерфейса из кода 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(), ""); 
1

Используйте это:

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

Есть ли способ, которым мне не нужен жесткий код «статический»? – Pell000

+0

Весной стандартный путь класса для ресурсов - «src/main/resources». Таким образом, после этого вам придется добавить полный путь. Очевидно, что вы можете воспользоваться сочетанием шаблонов и т. Д., Но в конце концов вам все равно придется его предоставить. –

+0

См. Мой ответ. Мне удалось сделать это, не предоставляя полный путь, используя некоторые компоненты Spring. Я думаю, что «src/main/resources/static» также помещается в путь класса. Однако, если мое понимание ошибочно, сообщите мне. – Pell000