Thymeleaf;«произошла ошибка при разборе шаблона» - PullRequest
0 голосов
/ 11 октября 2018

В настоящее время у меня возникают проблемы с springboot и ошибкой "Произошла ошибка при разборе шаблона (template:" class path resource [templates / mainpage.html]) ".

Я пытался переустановитьдругая версия lombok, потому что я думал, что это может быть проблемой, но пока что ничего не работает. Я использую gradle с Eclipse в качестве IDE. Любая помощь приветствуется, нашел несколько потоков с той же проблемой из-за различных springBootVersions, но попыталсястарые и новые, и он также не исправил это для меня.

Мой build.gradle выглядит так:

buildscript {
ext {
    springBootVersion = '2.0.3.RELEASE'
}
repositories {
    mavenCentral()
}
dependencies {
    classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
}
}

apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'org.springframework.boot'
apply plugin: 'io.spring.dependency-management'

group = 'test'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = 1.8

repositories {
 mavenCentral()
}

dependencies {
  compile('org.springframework.boot:spring-boot-starter-thymeleaf')
  compile('org.springframework.boot:spring-boot-starter-web')
  runtime('org.springframework.boot:spring-boot-devtools')
  testCompile('org.springframework.boot:spring-boot-starter-test')
  compileOnly 'org.projectlombok:lombok:1.18.2'
}

Мой Контроллер :

package test;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;

@Controller
public class ExampleController {

    @GetMapping(path = "/")
    public String mainpage(Model model) {
        return "mainpage";
    }

    @PostMapping(path = "/")
    public String calculate(Model model, Calc cal) {
        model.addAttribute("cal", cal);
        return "mainpage";
    }
}

Файл Calc.java с ломбком:

@Data
public class Calc {

    private Long val1;
    private Long val2;

    public Long getSum() {
        return this.val1 + this.val2;
    }
}

И мой mainpage.html :

<html>
    <title>Homepage</title> 
    <body>
        <form method="post">
            <input type="text" name="val1" th:value="${cal.val1}"> </input>
            <input type="text" name="val2" th:value="${cal.val2}"> </input>
            <input type="submit"></input>	
        </form> 
        <p th:text="| ${cal.val1} and ${cal.val2} equals ${cal.sum}|"></p>
    </body>
</html>

Ответы [ 2 ]

0 голосов
/ 13 октября 2018

Проблема возникает из вашей первой конечной точки, где вы не определили атрибут типа Calc, поэтому синтаксический анализ mainpage.html завершается неудачно из-за отсутствия этого атрибута и из-за невозможности сопоставить его тип класса (поля) супомянутые в HTML.

Вы должны либо использовать оператор ? от Thymeleaf (который является правильным способом обработки этого);

<input type="text" name="val1" th:value="${cal?.val1}"> </input> 

или просто передать пустой объект Calc в качестве атрибута в вашем первомконечная точка;

@GetMapping(path="/")
public String mainpage(Model model) {

    model.addAttribute("cal", new Calc());
    return "mainpage";
}

"?" оператор (оператор безопасной навигации) предназначен для охвата нулевых случаев, например, cal?.val1 означает, использовать val1 значение поля атрибута cal, если calне нулевое, иначе используйте пустое.

0 голосов
/ 12 октября 2018

Понизьте springBootVersion до '1.5.10.RELEASE' и добавьте следующий класс в ваш пакет приложений.

@Configuration
public class MvcConfig extends WebMvcConfigurerAdapter {

    @Bean
    @Description("Thymeleaf template resolver serving HTML 5")
    public ClassLoaderTemplateResolver templateResolver() {
        ClassLoaderTemplateResolver templateResolver = new ClassLoaderTemplateResolver();
        templateResolver.setPrefix("templates/");
        templateResolver.setCacheable(false);
        templateResolver.setSuffix(".html");
        templateResolver.setTemplateMode("HTML5");
        templateResolver.setCharacterEncoding("UTF-8");
        return templateResolver;
    }

    @Bean
    public ServletContextTemplateResolver servletContextTemplateResolverResolver() {
        final ServletContextTemplateResolver resolver =
                new ServletContextTemplateResolver();
        resolver.setPrefix("/WEB-INF/templates/");
        resolver.setSuffix(".html");
        resolver.setTemplateMode("HTML5");
        resolver.setCacheable(false);
        resolver.setCharacterEncoding("UTF-8");
        return resolver;
    }

    @Bean
    @Description("Thymeleaf template engine with Spring integration")
    public SpringTemplateEngine templateEngine() {
        SpringTemplateEngine templateEngine = new SpringTemplateEngine();
        templateEngine.addTemplateResolver(new UrlTemplateResolver());
        templateEngine.addDialect(new SpringSecurityDialect());
        templateEngine.setTemplateResolver(templateResolver());
        return templateEngine;
    }


    @Bean
    @Description("Thymeleaf view resolver")
    public ViewResolver viewResolver() {
        ThymeleafViewResolver viewResolver = new ThymeleafViewResolver();
        viewResolver.setTemplateEngine(templateEngine());
        viewResolver.setCharacterEncoding("UTF-8");
        return viewResolver;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...