Получите HTML-файл thymeleaf со всеми включениями

#html #spring #spring-boot #thymeleaf

Вопрос:

Ребята, я новичок в Thymeleaf, моя цель-иметь конечную точку, которая возвращает строку с содержимым html-файла. Должно быть легко, но этот html-файл содержит код thymeleaf и использует фрагменты из других файлов, поэтому использование Files.ReadString(путь) не достигает цели.

Как я могу их включить (я хочу включать только фрагменты, мне не нужно обрабатывать файл)?

Это то, что я делал до сих пор:

 @GetMapping(path = "/get-template-html")
public String getTemplateHTMLEndpoint() {
    
    String templateHtml = "Problems reading template.html";
    
    try {
        String stringPath = new ClassPathResource("templates/template.html").getFile().getPath();
        Path path = Path.of(stringPath);
        templateHtml = Files.readString(path);
    } catch (IOException e) {
        e.printStackTrace();
    }
    
    return templateHtml;
    
}
 

Но в другом методе, где я обрабатываю файл, передавая контекст, я получил ошибку о фрагменте «нижний колонтитул::нижний колонтитул».

     String templateHtml = callGetTemplateHTMLEndPoint();

    StringTemplateResolver stringTemplateResolver = new StringTemplateResolver();
    stringTemplateResolver.setTemplateMode(TemplateMode.HTML);
    TemplateEngine templateEngine = new TemplateEngine();
    templateEngine.setTemplateResolver(stringTemplateResolver);
    
    Context context = new Context();
    context.setVariable("expenseReportPdf", expenseReportPdf);
    context.setVariable("expensePdf", expensePdfList);
    context.setVariable("expenseImg", jpgFile);
    context.setVariable("amountCompanyCurrency", amountCompanyCurrency);
    context.setVariable("expenseIncurredList", expenseIncurredList);
    context.setVariable("expenseRiepiloghiList",expenseRiepiloghiList);
    context.setVariable("advancePayBigDecimal", advancePayBigDecimal);
    context.setVariable("dailyAllowanceList", dailyAllowanceList);
    context.setVariable("dailyAllowanceFlag", dailyAllowanceFlag);
    context.setVariable("logo",logo);
    context.setVariable("logoSmartex",logoSmartex);


    String renderedHtmlContent = templateEngine.process(templateHtml, context);
 

Комментарии:

1. Что именно вы пробовали? Если вы просто хотите использовать фрагменты Thymeleaf с Spring Boot, вы можете посмотреть одну из моих записей в блоге (например wimdeblauwe.com/blog/2021/09/14/… ) для примера, в котором используются фрагменты.

Ответ №1:

Если вы создали «стандартную» весеннюю загрузку с проектом Thymeleaf (например, с помощью https://start.spring.io), затем шаблоны будут автоматически разрешены, если вы поместите их в src/main/resources/templates

Поэтому , если вы создали src/main/resources/templates/templates.html , вы можете создать контроллер, который будет использовать этот шаблон следующим образом:

 @Controller
@RequestMapping("/")
public class MyController {

  @GetMapping("/get-template-html")
  public String getTemplateHtml() {
    return "templates"; // name of your template file without the .html extension
  }
}
 

Если вы запустите приложение и получите доступ http://localhost:8080/get-template-html, вы должны увидеть HTML-код шаблона.

Комментарии:

1. Да, я знаю, Тай, но это не то, чего я хочу. Мне нужна конечная точка для его извлечения, потому что этот файл используется в разных проектах

2. Вы хотите получить необработанный шаблон без обработки Thymeleaf, чтобы вы могли выполнить вызов REST из одного проекта в другой и повторно использовать его? Если да, то не можете ли вы создать общую библиотеку Java?

3. Не знаю, кажется, это хорошее решение, я делаю только то, что сказал мне мой босс, я всего лишь стажер.