2015-03-28 5 views
5

Я пытаюсь использовать макеты/шаблоны с Thymeleaf, но я получаю следующее исключение.Thymeleaf: Error Resolving Template

шаблон обработки исключений «пользователь/индекс»: Ошибка разрешение шаблона «/layouts/default.html», шаблон не может существовать или не может быть доступны с помощью любого из настроенных шаблонов резольверов

Здесь мой 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; 
    } 
} 

Я имею следующую структуру папок

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

Вот мой default.html, который является моим основным макетом.

<!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> 

Вот 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> 

Они находятся в разных папках, но Pathing должен работать, если я не буду просто не хватает что-то действительно глупо.

ответ

8

Я нашел свою проблему. Если вы укажете суффикс в вашей конфигурации Thymeleaf, вам не потребуется расширение .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; 
    } 

Оно должно быть:

layout:decorator="layouts/default" 

Вместо:

layout:decorator="layouts/default.html" 

Я предполагаю, что это эффективно ищет макеты/default.html.html, который был бы проблемой.

0

Вы не должны давать extension.And вы должны обеспечить правильный путь, как этот

макет: декоратор = «../ раскладки/по умолчанию»

+0

Пожалуйста, прочитайте [Как написать хороший ответ?] (Http://stackoverflow.com/help/how-to-answer), прежде чем пытаться ответить на другие вопросы. –

0

Я решил эту проблему, имея следующий код:

@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; 
} 

}

хитрость в том, чтобы добавить: emailTemplateResolver.setPrefix("classpath:/templates/");