Spring Boot и Thymeleaf: не удается найти HTML-шаблоны

Вопрос:

Я пытаюсь создать приложение Spring Boot-based с Thymeleaf. Я использую образец PetClinic в качестве отправной точки. Мое приложение не может найти некоторые из шаблонов.

Мой проект настроен стандартным образом:

/src
/main
/java
/com.example
MyWebApplication.java
HomeController.java
/resources
/static
/css
/templates
/fragments
layout.html
home.html
application.properties

pom.xml

<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.1.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>

<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>

<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>
</dependencies>

MyWebApplication.java

@SpringBootApplication
public class MyWebApplication {
public static void main(String[] args) {
SpringApplication.run(MyWebApplication.class, args);
}
}

HomeController.java

@Controller
public class HomeController {

@RequestMapping("/")
public String home() {
return "home";
}
}

home.html

<!DOCTYPE html>

<html xmlns:th="http://www.thymeleaf.org"
xmlns:layout="http://www.ultraq.net.nz/web/thymeleaf/layout"
th:replace="~{fragments/layout :: layout (~{::body},'home')}">
<body>
<h2 th:text="#{welcome}">Welcome</h2>
<div class="row">
</div>
</body>

</html>

layout.html

<!DOCTYPE html>

<!--
The main layout fragment that defines the overall layout
Sets up the navigation bar
The page contents are replaced in the main div
-->
<html xmlns:th="http://www.thymeleaf.org" xmlns:layout="http://www.ultraq.net.nz/web/thymeleaf/layout"
th:fragment="layout (template, menu)">

<head>

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">

<!-- <link rel="shortcut icon" type="image/x-icon" th:href="@{/images/favicon.png}"> -->

<title>Web Interface</title>

<link rel="stylesheet" th:href="@{/css/bootstrap.min.css}" />

</head>

<body>

<!-- Navigation Bar -->
<nav class="navbar navbar-default" role="navigation">
<div class="container">
<div class="navbar-header">
<a class="navbar-brand glyphicon glyphicon-home" th:href="@{/}"></a>

<!-- Collapse the menu bar on small windows -->
<button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#main-navbar">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
</div>

<!-- The Navbar items -->
<div class="navbar-collapse collapse" id="main-navbar">
<ul class="nav navbar-nav navbar-right">

<!-- Define a fragment for each menu item -->
<li th:fragment="menuItem (path, active, title, glyph, text)" th:class="${active==menu ? 'active' : ''}">
<a th:href="@{__${path}__}" th:title=${title}>
<span th:class="'glyphicon glyphicon-'+${glyph}" class="glyphicon glyphicon-home" aria-hidden="true"></span>
<span th:text="${text}">Template</span>
</a>
</li>

<!-- Replace with the fragment -->
<li th:replace="::menuItem ('/', 'home', 'home page', 'home', 'Home')">
<span class="glyphicon glyphicon-home" aria-hidden="true"></span>
<span> Home</span>
</li>
</ul>
</div>
</div>
</nav>

<!-- Main body -->
<div class="container-fluid">
<div class="container xd-container">
<div th:replace="${template}"></div>
</div>

</div>

<script th:src="@{/js/bootstrap.min.js}" type="text/javascript"></script>

</body>

</html>

application.properties пуст.

Когда я перехожу к http://localhost:8080 я получаю ошибку:

Шаблон разрешения ошибки “~ {фрагменты/макет”, шаблон может не существовать или может быть недоступен ни одним из настроенных шаблонов Resolvers (home: 5)

Если я удалю атрибут “th: replace” из home.html, он отобразит приветственное сообщение.

Просмотрев похожие вопросы (например, этот), я вижу, что другие люди создают ThymeleafViewResolver bean.

Вопросов:

  1. Почему он не может найти мои шаблоны?
  2. Нужно ли создавать шаблонный резольвер? Если да, то почему нет образца клиники для домашних животных? Откуда появился свой шаблонный резольвер?

Насколько я вижу, он настроен так же, как образец клиники для домашних животных, так какая разница?

Лучший ответ:

Spring boot делает некоторые внутренние работы автоматически для вас, но для выполнения этой автоматизированной работы вам необходимо правильно ее настроить. Это ответ на ваш вопрос 2, пружина автоматически обеспечивает разрешение, если конфигурация правильная. Итак, теперь переходим к вопросу 1.

Если вы сравните свой pom.xml с циклыкой, вы увидите некоторые ключевые отличия.

Сначала, согласно весеннему официальному документу http://docs.spring.io/spring-boot/docs/current/reference/html/using-boot-build-systems.html#using-boot-maven, пользователи Maven могут наследовать от родительского проекта spring-boot-starter, чтобы получить разумные значения по умолчанию. Родительский проект предоставляет некоторые функции. Чтобы настроить проект наследования с родителя-родителя-стартера, просто установите родителя в свой pom.xml.

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.5.1.RELEASE</version>
</parent>

С помощью этой настройки вы также можете переопределить отдельные зависимости, переопределив свойство в своем собственном проекте. Например, в petclinic pom.xml они указали версию тимелеафа, которая отсутствует в вашей.

<thymeleaf.version>3.0.2.RELEASE</thymeleaf.version>

Теперь, чтобы правильно настроить диалектную версию тимелеафа и тимелеафа с совместимостью между ними, вам нужно исключить тимелеаф-макет-диалект из spring-boot-starter-thymeleaf, bcz – установить версию тимелеафа до версии 3.0.2.RELEASE.

    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-thymeleaf</artifactId>
      <exclusions>
        <exclusion>
            <groupId>nz.net.ultraq.thymeleaf</groupId>
            <artifactId>thymeleaf-layout-dialect</artifactId>
        </exclusion>
      </exclusions>
    </dependency>

Оцените статью
TechArks.Ru
Добавить комментарий