8
respostas

[Bug] Erro na etapa de edição - An error happened during template parsing (template: "class path resource...

Olá, pessoal. Boa tarde. Por favor, poderiam me ajudar? Estou seguindo este curso e fazendo um projeto semelhante, no meu caso, ao invés de editar um filme, seria editado os dados de um usuário. Tudo estava ok até então... fiz as alterações no @GetMapping ficando da seguinte forma, como instruído:

    @GetMapping("/formulario")//verbo HTTP
    public String carregaPaginaFormulario(String cpf, Model model) {
        if (cpf != null){
            var usuario = repository.getReferenceById(cpf);
            model.addAttribute("usuario", usuario);
        }
        return "usuarios/formulario"; 
    }

E na minha página de cadastro, fiz como pedido, incluindo th:value em cada input... ficando dessa forma:

        <h1>Cadastro de Usuários</h1>
        <form method="post" action="/usuarios"><!-- Método post: envio -->
                <label for="nome">Nome:</label>
                <input type="text" id="nome" name="nome"><br>

                <label for="cpf">CPF:</label>
                <input type="text" id="cpf" name="cpf" placeholder="Ex.: 00000000000" th:value="${usuario.cpf}"><br>

                <label for="datanasc">Data de nascimento:</label>
                <input type="date" id="datanasc" name="datanasc" placeholder="Ex.: dd/mm/aaaa" th:value="${usuario.datanasc}"><br>

                <label for="sexo">Sexo:</label>
                <input type="radio" id="sexo" value="F" name="sexo" th:value="${usuario.sexo}">
                <label for="sexo">Feminino</label>
                <input type="radio" id="sexo" value="F" name="sexo" th:value="${usuario.sexo}">
                <label for="sexo">Masculino</label><br>

                <label for="cargo">Cargo:</label>
                <input type="text" id="cargo" name="cargo" th:value="${usuario.cargo}"><br>

            <input type="submit" value="Cadastrar">
        </form>

Porém, percebi que se retiro todos os th:value com exceção do cpf, a pagina recarrega normalmente com o campo do cpf já preenchido mas apenas ele. Se deixo todos, ou ao menos um que não seja o cpf, já gera um erro ao clicar para abrir a página de formulario em branco ou para edição. É possível ver nas imagens abaixo. Existe o "caused by" para todos os atributos, exceto para o cpf.

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

8 respostas

Oi Bianca!

Na sua classe Usuario o atributo se chama datanasc?

O nome utilizado no th:value deve ser exatamente o mesmo nome do atributo na classe Usuario.

Sim, Rodrigo. Está tudo com o mesmo nome que foi dado aos atributos da classe.

Manda aqui o código da sua classe Usuario e o resto da exception, que no print anterior saiu incompleto.

Mando sim!! Vou colocar aqui embaixo a minha classe pai Pessoa e em seguida a classe filha, Usuário.

@MappedSuperclass
public abstract class Pessoa {
    private String nome;
    @Id
    private String cpf;
    private Date datanasc;
    private Character sexo;

    public Pessoa(String nome, String cpf, Date datanasc, Character sexo) {
        this.nome = nome;
        this.cpf = cpf;
        this.datanasc = datanasc;
        this.sexo = sexo;
    }

    public Pessoa(){}

    @Override
    public String toString() {
        return "Pessoa [nome=" + nome + ", cpf=" + cpf + ", datanasc=" + datanasc + ", sexo=" + sexo + "]";
    }

    public String getNome() {
        return nome;
    }

    public String getCpf() {
        return cpf;
    }

    public Date getDatanasc() {
        return datanasc;
    }

    public Character getSexo() {
        return sexo;
    }
@Entity //A classe filme é uma entidade, representando uma tabela no banco, que é a Usuários
@Table(name="usuarios")
@PrimaryKeyJoinColumn(name = "cpf")
public class Usuario extends Pessoa{

    private String cargo;
    private LocalDateTime datacadastro;

    public Usuario(){}

    public Usuario(DadosCadastroUsuario dados) {
        super(dados.nome(), dados.cpf(), dados.datanasc(), dados.sexo());
        this.cargo = dados.cargo();
        this.datacadastro = LocalDateTime.now();
    }

    public String getCargo() {
        return cargo;
    }

    public LocalDateTime getDataCadastro() {
        return datacadastro;
    }

    @Override
    public String toString() {
        return super.toString()+", cargo=" + cargo + ", Data de Cadastro=" + datacadastro + "]";
    }

Agora vou colocar o erro que tem ocorrido ao clicar em novo formulário ou editar para alteração de um usuário. A continuação vai nos posts seguintes por ser extenso...

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

Mon Jun 05 16:53:20 BRT 2023 There was an unexpected error (type=Internal Server Error, status=500). An error happened during template parsing (template: "class path resource [templates/usuarios/formulario.html]") org.thymeleaf.exceptions.TemplateInputException: An error happened during template parsing (template: "class path resource [templates/usuarios/formulario.html]") at org.thymeleaf.templateparser.markup.AbstractMarkupTemplateParser.parse(AbstractMarkupTemplateParser.java:241) at org.thymeleaf.templateparser.markup.AbstractMarkupTemplateParser.parseStandalone(AbstractMarkupTemplateParser.java:100) at org.thymeleaf.engine.TemplateManager.parseAndProcess(TemplateManager.java:666) at org.thymeleaf.TemplateEngine.process(TemplateEngine.java:1103) at org.thymeleaf.TemplateEngine.process(TemplateEngine.java:1077) at org.thymeleaf.spring6.view.ThymeleafView.renderFragment(ThymeleafView.java:372) at org.thymeleaf.spring6.view.ThymeleafView.render(ThymeleafView.java:192) at org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1415) at org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:1159) at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1098) at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:974) at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1011) at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:903) at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:564) at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:885) at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:658) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:205) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:149) at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:174) at

org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:149) at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:174) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:149) at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:174) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:149) at org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:91) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:174) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:149) at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:174) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:149) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:166) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90) at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:482) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:115) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:341) at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:390) at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63) at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:894) at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1741) at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52) at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191) at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659) at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) at java.base/java.lang.Thread.run(Unknown Source) Caused by: org.attoparser.ParseException: Exception evaluating SpringEL expression: "usuario.nome" (template: "usuarios/formulario" - line 11, col 58) at org.attoparser.MarkupParser.parseDocument(MarkupParser.java:393) at org.attoparser.MarkupParser.parse(MarkupParser.java:257) at org.thymeleaf.templateparser.markup.AbstractMarkupTemplateParser.parse(AbstractMarkupTemplateParser.java:230) ... 52 more Caused by: org.thymeleaf.exceptions.TemplateProcessingException: Exception evaluating SpringEL expression: "usuario.nome" (template: "usuarios/formulario" - line 11, col 58) at org.thymeleaf.spring6.expression.SPELVariableExpressionEvaluator.evaluate(SPELVariableExpressionEvaluator.java:292) at org.thymeleaf.standard.expression.SelectionVariableExpression.executeSelectionVariableExpression(SelectionVariableExpression.java:158) at org.thymeleaf.standard.expression.SimpleExpression.executeSimple(SimpleExpression.java:92) at org.thymeleaf.standard.expression.Expression.execute(Expression.java:109) at org.thymeleaf.standard.expression.Expression.execute(Expression.java:138) at org.thymeleaf.standard.processor.AbstractStandardExpressionAttributeTagProcessor.doProcess(AbstractStandardExpressionAttributeTagProcessor.java:144) at org.thymeleaf.processor.element.AbstractAttributeTagProcessor.doProcess(AbstractAttributeTagProcessor.java:74) at org.thymeleaf.processor.element.AbstractElementTagProcessor.process(AbstractElementTagProcessor.java:95) at org.thymeleaf.util.ProcessorConfigurationUtils$ElementTagProcessorWrapper.process(ProcessorConfigurationUtils.java:633) at org.thymeleaf.engine.ProcessorTemplateHandler.handleStandaloneElement(ProcessorTemplateHandler.java:918)

at org.thymeleaf.engine.StandaloneElementTag.beHandled(StandaloneElementTag.java:228)
at org.thymeleaf.engine.Model.process(Model.java:282)
at org.thymeleaf.engine.ProcessorTemplateHandler.handleOpenElement(ProcessorTemplateHandler.java:1587)
at org.thymeleaf.engine.OpenElementTag.beHandled(OpenElementTag.java:205)
at org.thymeleaf.engine.Model.process(Model.java:282)
at org.thymeleaf.engine.ProcessorTemplateHandler.handleOpenElement(ProcessorTemplateHandler.java:1587)
at org.thymeleaf.engine.OpenElementTag.beHandled(OpenElementTag.java:205)
at org.thymeleaf.engine.Model.process(Model.java:282)
at org.thymeleaf.engine.Model.process(Model.java:290)
at org.thymeleaf.engine.GatheringModelProcessable.process(GatheringModelProcessable.java:78)
at org.thymeleaf.engine.ProcessorTemplateHandler.handleCloseElement(ProcessorTemplateHandler.java:1640)
at org.thymeleaf.engine.TemplateHandlerAdapterMarkupHandler.handleCloseElementEnd(TemplateHandlerAdapterMarkupHandler.java:388)
at org.thymeleaf.templateparser.markup.InlinedOutputExpressionMarkupHandler$InlineMarkupAdapterPreProcessorHandler.handleCloseElementEnd(InlinedOutputExpressionMarkupHandler.java:322)
at org.thymeleaf.standard.inline.OutputExpressionInlinePreProcessorHandler.handleCloseElementEnd(OutputExpressionInlinePreProcessorHandler.java:220)
at org.thymeleaf.templateparser.markup.InlinedOutputExpressionMarkupHandler.handleCloseElementEnd(InlinedOutputExpressionMarkupHandler.java:164)
at org.attoparser.HtmlElement.handleCloseElementEnd(HtmlElement.java:169)
at org.attoparser.HtmlMarkupHandler.handleCloseElementEnd(HtmlMarkupHandler.java:412)
at org.attoparser.MarkupEventProcessorHandler.handleCloseElementEnd(MarkupEventProcessorHandler.java:473)
at org.attoparser.ParsingElementMarkupUtil.parseCloseElement(ParsingElementMarkupUtil.java:201)
at org.attoparser.MarkupParser.parseBuffer(MarkupParser.java:725)
at org.attoparser.MarkupParser.parseDocument(MarkupParser.java:301)
... 54 more

Caused by: org.springframework.expression.spel.SpelEvaluationException: EL1007E: Property or field 'nome' cannot be found on null at org.springframework.expression.spel.ast.PropertyOrFieldReference.readProperty(PropertyOrFieldReference.java:218) at org.springframework.expression.spel.ast.PropertyOrFieldReference.getValueInternal(PropertyOrFieldReference.java:105) at org.springframework.expression.spel.ast.PropertyOrFieldReference$AccessorLValue.getValue(PropertyOrFieldReference.java:410) at org.springframework.expression.spel.ast.CompoundExpression.getValueInternal(CompoundExpression.java:93) at org.springframework.expression.spel.ast.SpelNodeImpl.getValue(SpelNodeImpl.java:114) at org.springframework.expression.spel.standard.SpelExpression.getValue(SpelExpression.java:338) at org.thymeleaf.spring6.expression.SPELVariableExpressionEvaluator.evaluate(SPELVariableExpressionEvaluator.java:265) ... 84 more

Rodrigo, coloquei nos posts acima o erro e quis ressaltar que, quando eu permaneço apenas com o th:value referente ao input do cpf, tudo ocorre bem. A página de formulário abre normalmente e o campo de cpf vem, inclusive, preenchido quando clica em editar. Mas basta colocar th:value em qualquer um dos inputs restantes que o erro aparece.

Blz, ta certinho o código.

O problema deve estar acontecendo quando entra na página para cadastrar um novo registro. Mais adiante no curso vai ser mostrado como resolver essa situação.