web-dev-qa-db-fra.com

Thymeleaf: Modèle de résolution d'erreur

J'essaie d'utiliser des mises en page/modèles avec Thymeleaf mais je reçois l'exception suivante.

Modèle de traitement des exceptions "utilisateur/index": erreur lors de la résolution du modèle "/layouts/default.html", le modèle peut ne pas exister ou être accessible par l'un des résolveurs de modèles configurés

Voici mon ThymeleafConfig.Java

@Configuration
public class ThymeleafConfig {

    @Bean
    public ServletContextTemplateResolver templateResolver() {
        ServletContextTemplateResolver resolver = new ServletContextTemplateResolver();
        resolver.setPrefix("/WEB-INF/views/");
        resolver.setSuffix(".html");
        resolver.setTemplateMode("HTML5");
        resolver.setOrder(1);
        return resolver;
    }

    @Bean
    public SpringTemplateEngine templateEngine() {
        SpringTemplateEngine engine = new SpringTemplateEngine();
        engine.setTemplateResolver(templateResolver());
        engine.addDialect(new LayoutDialect());
        engine.addDialect(new SpringSecurityDialect());
        engine.addDialect(new SpringStandardDialect());
        return engine;
    }

    @Bean
    public ThymeleafViewResolver thymeleafViewResolver() {
        ThymeleafViewResolver resolver = new ThymeleafViewResolver();
        resolver.setTemplateEngine(templateEngine());
        return resolver;
    }
}

J'ai la structure de dossier suivante

webapp/
..WEB-INF/
....views/
......layouts/
........default.html
......user
........index.html

Voici mon default.html qui est ma mise en page principale.

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org" xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout">
<head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=Edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Default</title>
    <link href="//maxcdn.bootstrapcdn.com/bootstrap/3.3.4/css/bootstrap.min.css" rel="stylesheet" />
</head>
<body>

    <header>
        This is a header from default.html
    </header>

    <section layout:fragment="content">
        <p>Content should go here!</p>
    </section>

    <footer>
        Footer from default
        <p layout:fragment="custom-footer">Custom footer here!</p>
    </footer>

    <!-- scripts -->
    <script src="https://code.jquery.com/jquery-2.1.3.min.js" />
    <script src="//maxcdn.bootstrapcdn.com/bootstrap/3.3.4/js/bootstrap.min.js"></script>

</body>
</html>

Voici l'index.html

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
      layout:decorator="layouts/default.html">
<head>
    <title>Users</title>
</head>
<body>
<section layout:fragment="content">
    <p>This is a paragraph from content page 1</p>
</section>
<footer>
    <p layout:fragment="custom-footer">This is some footer content from content page 1</p>
</footer>
</body>
</html>

Ils sont dans des dossiers différents, mais le chemin doit fonctionner à moins que je ne manque quelque chose de vraiment stupide.

6
jkratz55

J'ai trouvé mon problème. Si vous spécifiez le suffixe dans votre configuration Thymeleaf, vous n'avez pas besoin de l'extension .html.

@Bean
    public ServletContextTemplateResolver templateResolver() {
        ServletContextTemplateResolver resolver = new ServletContextTemplateResolver();
        resolver.setPrefix("/WEB-INF/views/");
        **resolver.setSuffix(".html");**
        resolver.setTemplateMode("HTML5");
        resolver.setOrder(1);
        return resolver;
    }

CA devrait etre:

layout:decorator="layouts/default"

Au lieu de:

layout:decorator="layouts/default.html"

J'imagine qu'il recherchait effectivement layouts/default.html.html, ce qui poserait problème.

8
jkratz55

Vous ne devez pas donner l'extension. Et vous devez fournir le chemin correct comme ceci

layout: decorator = "../ layouts/default"

0
love kumar

J'ai résolu ce problème en ayant le code suivant:

@Configuration
public class ThymeleafConfig{

@Bean
public SpringTemplateEngine springTemplateEngine()
{
    SpringTemplateEngine templateEngine = new SpringTemplateEngine();
    templateEngine.addTemplateResolver(htmlTemplateResolver());
    return templateEngine;
}

@Bean
public SpringResourceTemplateResolver htmlTemplateResolver()
{
    SpringResourceTemplateResolver emailTemplateResolver = new SpringResourceTemplateResolver();
    emailTemplateResolver.setPrefix("classpath:/templates/");
    emailTemplateResolver.setSuffix(".html");
    emailTemplateResolver.setTemplateMode(StandardTemplateModeHandlers.HTML5.getTemplateModeName());
    emailTemplateResolver.setCharacterEncoding(StandardCharsets.UTF_8.name());
    return emailTemplateResolver;
}

}

L'astuce consistait à ajouter: emailTemplateResolver.setPrefix("classpath:/templates/");

0
Shehan Simen