Solucionado (ver solução)
Solucionado
(ver solução)
7
respostas

ERROR 13757 --- [nio-8080-exec-4] o.thymeleaf.templateparser.ErrorHandler : [THYMELEAF][http-nio-8080-exec-4] Fatal error during parsing

Prezados,

Estou na Aula 02 - video 02 - Configurando Spring Boot Data JPA, fiz o exemplo ate o minuto 28:10, porem quando tento executar a aplicacao e mostrar minha lista de convidados na listaconvidados.html, recebo o seguinte erro:

2017-10-06 01:24:34.041  INFO 13885 --- [nio-8080-exec-1] o.h.h.i.QueryTranslatorFactoryInitiator  : HHH000397: Using ASTQueryTranslatorFactory
-- CONVIDADOS: [Convidado [id =1, nome =Larazo Prates Junior, email =larazo@alura.com.br, telefone =99998888], Convidado [id =2, nome =Maria do Carmo, email =maria@gmail.com, telefone =33442233], Convidado [id =3, nome =Antonio da Silva, email =toni@alura.com.br, telefone =99997777]]
    Convidado [id =1, nome =Larazo Prates Junior, email =larazo@alura.com.br, telefone =99998888]
    Convidado [id =2, nome =Maria do Carmo, email =maria@gmail.com, telefone =33442233]
    Convidado [id =3, nome =Antonio da Silva, email =toni@alura.com.br, telefone =99997777]
2017-10-06 01:24:34.318 ERROR 13885 --- [nio-8080-exec-1] o.thymeleaf.templateparser.ErrorHandler  : [THYMELEAF][http-nio-8080-exec-1] Fatal error during parsing

org.xml.sax.SAXParseException: Element type "span" must be followed by either attribute specifications, ">" or "/>".
    at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.createSAXParseException(ErrorHandlerWrapper.java:203) ~[na:1.8.0_91]
    at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.fatalError(ErrorHandlerWrapper.java:177) ~[na:1.8.0_91]
    at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:400) [na:1.8.0_91]
    at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:327) [na:1.8.0_91]
    at com.sun.org.apache.xerces.internal.impl.XMLScanner.reportFatalError(XMLScanner.java:1438) [na:1.8.0_91]
.
.
.
    at java.lang.Thread.run(Thread.java:745) [na:1.8.0_91]

2017-10-06 01:24:34.320 ERROR 13885 --- [nio-8080-exec-1] org.thymeleaf.TemplateEngine             : [THYMELEAF][http-nio-8080-exec-1] Exception processing template "listaconvidados": Exception parsing document: template="listaconvidados", line 23 - column 43
2017-10-06 01:24:34.323 ERROR 13885 --- [nio-8080-exec-1] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.thymeleaf.exceptions.TemplateInputException: Exception parsing document: template="listaconvidados", line 23 - column 43] with root cause

org.xml.sax.SAXParseException: Element type "span" must be followed by either attribute specifications, ">" or "/>".
    at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.createSAXParseException(ErrorHandlerWrapper.java:203) ~[na:1.8.0_91]
    at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.fatalError(ErrorHandlerWrapper.java:177) ~[na:1.8.0_91]
    at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:400) ~[na:1.8.0_91]
    at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:327) ~[na:1.8.0_91]
.
.
.
7 respostas

Meu pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>br.com.alura.listavip</groupId>
    <artifactId>listavip</artifactId>
    <version>0.0.1-SNAPSHOT</version>

    <dependencies>

        <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-parent -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>1.5.7.RELEASE</version>
            <type>pom</type>
        </dependency>


        <!-- Dependencia do Spring Boot -->
        <!-- Dependencia responsavel por componentes web -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <version>1.5.7.RELEASE</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-thymeleaf -->
        <!-- Dependencia responsavel pelas rotas -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
            <version>1.5.7.RELEASE</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-data-jpa -->
        <!-- Dependencia responsavel JPA para persistencia e leitura em banco de 
            dados -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
            <version>1.5.7.RELEASE</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
        <!-- Driver de conexao MySQL -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.39</version>
        </dependency>

    </dependencies>

</project>

Minha ConvidadoController.java

package br.com.alura.listavip;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import br.com.alura.listavip.model.Convidado;
import br.com.alura.listavip.repository.ConvidadoRepository;

@Controller
public class ConvidadoController {

    @Autowired
    private ConvidadoRepository repository;

    @RequestMapping("/")
    public String index(){
        return "index";    // retorna o template index.html por convencao
    }

    @RequestMapping("/listaconvidados")
    public String listaConvidados(Model model){

        Iterable<Convidado> convidados = repository.findAll();    // pega a lista do repositorio

        System.out.println("-- CONVIDADOS: " + convidados.toString());
        for (Convidado convidado : convidados) {
            System.out.println("\t" + convidado.toString());
        }

        model.addAttribute("convidados", convidados);            // insert a lista de convidados no modelo

        return "listaconvidados";                                // retorna o template listaconvidados.html por convencao
    }

}

Quando chamo a URL http://localhost:8080/listaconvidados, recebe essa mensagem de erro no navegador:

Whitelabel Error Page

This application has no explicit mapping for /error, so you are seeing this as a fallback.

Fri Oct 06 01:24:34 BRT 2017
There was an unexpected error (type=Internal Server Error, status=500).
Exception parsing document: template="listaconvidados", line 23 - column 43

Olá Renato, o primeiro erro que você postou refere-se a um problema no seu listaconvidados.html, acredito que está faltando fechar a tag span em algum momento, veja se o seu JSP fecha corretamente a tag span conforme o exemplo abaixo:

<div class="container">
        <div id="listaDeConvidados">
            <table class="table table-hover">
                <thead>
                    <tr>
                        <th>Nome</th>
                        <th>Email</th>
                        <th>Nome</th>
                    </tr>
                </thead>
                <tr th:each="convidado : ${convidados}">
                    <td><span th:text="${convidado.nome}"></span></td>
                    <td><span th:text="${convidado.email}"></span></td>
                    <td><span th:text="${convidado.telefone}"></span></td>
                </tr>
            </table>
        </div>

Olá Denis, não creio ser isso, veja abaixo o meu listaconvidados.html

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head lang="en">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"></meta>
<title>Lista Convidados</title>
<link href="bootstrap-4.0.0/css/bootstrap.min.css" rel="stylesheet"></link>
</head>
<body>
    <h1>Lista de Convidados</h1>


    <div class="container">

        <div id="listaDeConvidados">
            <table class="table table-hover">
                <thead>
                    <tr>
                        <th>Nome</th>
                        <th>Email</th>
                        <th>Telefone</th>
                    </tr>
                    <tr th:each="convidado : ${convidados}">
                        <td><span th:text="${convidado.nome"} ></span></td>
                        <td><span th:text="${convidado.email"} ></span></td>
                        <td><span th:text="${convidado.telefone"} ></span></td>
                    </tr>
                </thead>
            </table>

        </div>

    </div>

    <script
        src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>
    <script src="bootstrap-4.0.0/js/bootstrap.min.js"></script>
</body>
</html>

Achei que poderia ser problema de não ter conseguido buscar os dados no banco, nas ao imprimir no console no metodo listaConvidados da classe ConvidadoController.java

@RequestMapping("/listaconvidados")
    public String listaConvidados(Model model){

        Iterable<Convidado> convidados = repository.findAll();    // pega a lista do repositorio

        System.out.println("-- CONVIDADOS: " + convidados.toString());
        for (Convidado convidado : convidados) {
            System.out.println("\t" + convidado.toString());
        }

        model.addAttribute("convidados", convidados);            // insert a lista de convidados no modelo

        return "listaconvidados";                                // retorna o template listaconvidados.html por convencao
    }

O problema esta no parse de pegar da Model na injeção dentro do template listaconvidados.html

solução!

Prezados,

Identifiquei o problema, o erro estava sendo gerado porque as colchetes estavam fora das aspas, no listaconvidados.html, conforme abaixo:

ERRADO:
<tr th:each="convidado : ${convidados}">
                        <td><span th:text="${convidado.nome"} ></span></td>
                        <td><span th:text="${convidado.email"} ></span></td>
                        <td><span th:text="${convidado.telefone"} ></span></td>
                    </tr>

CERTO:
<tr th:each="convidado : ${convidados}">
                        <td><span th:text="${convidado.nome}" ></span></td>
                        <td><span th:text="${convidado.email}" ></span></td>
                        <td><span th:text="${convidado.telefone}" ></span></td>
                    </tr>

Foi só corrigir isso que não deu mas problema, pior que essa parte correta do código "Denis Ricci" havia me passado aqui, mas infelizmente não percebi, grato a todos que ajudaram