5
respostas

Fiz novo método pois como estava na aula não funcionou

FilmeController.java

  @GetMapping("/formulario/editar/{id}")
    public String carregaPaginaEdicao(@PathVariable Long id, Model model) {
        if (id != null) {
            var filme = repository.getReferenceById(id);
            model.addAttribute("filme", filme);
        }
        return "filmes/formulario";
    }

listagem.html

 <a th:href="@{/filmes/formulario/editar/{id}(id=${filme.id})}">Editar</a>
5 respostas

Oi!

O que especificamente não funcionou?

O método da aula não estava funcionando, então criei o método acima que funcionou como na aula, abria a tela de formulário, mas duplicava a entrada. Na aula seguinte fui tentar manter meu método mas com as modificações em aula (ou algo do tipo) e parou de funcionar. Copiei o método da aula e continuou não funcionando.

FilmeController.java

package br.com.alura.screenmatch.controller;

@Controller
@RequestMapping("/filmes")
public class FilmeController {

    @Autowired
    private FilmeRepository repository;

    @GetMapping("/formulario")
    public String carregaPaginaFormulario() {
        return "filmes/formulario";
    }

    @GetMapping
    public String carregaPaginaListagem(Model model) {
        model.addAttribute("lista", repository.findAll());
        return "filmes/listagem";
    }

    @PutMapping
    @Transactional
    public String carregaPaginaEdicao(DadosAlteracaoFilme dados) {
        var filme = repository.getReferenceById(dados.id());
        filme.atualizaDados(dados);

        return "redirect:/filmes";
    }

    @PostMapping
    @Transactional
    public String cadastraFilme(DadosCadastroFilme dados) {
        var filme = new Filme(dados);
        repository.save(filme);

        return "redirect:/filmes";
    }

    @DeleteMapping
    @Transactional
    public String removeFilme(Long id) {
        repository.deleteById(id);
        return "redirect:/filmes";
    }
}

listagem.html

<!DOCTYPE html>
<html lang="en"
      xmlns:th="http://thymeleaf.org"
      xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
      layout:decorate="~{template.html}"
>
<head>
    <title>Lista de filmes</title>
</head>
<body>
<div layout:fragment="conteudo">
    <h1>Lista de Filmes</h1>
    <a href="/filmes/formulario">Novo</a>

    <table>
        <thead>
        <tr>
            <th>NOME</th>
            <th>DURAÇÃO</th>
            <th>ANO LANÇAMENTO</th>
            <th>GÊNERO</th>
            <th>AÇÕES</th>
        </tr>
        </thead>
        <tbody>
        <tr th:each="filme : ${lista}">
            <td th:text="${filme.nome}"></td>
            <td th:text="${filme.duracaoEmMinutos}"></td>
            <td th:text="${filme.anoLancamento}"></td>
            <td th:text="${filme.genero}"></td>
            <td>
                <a th:href="@{/filmes/formulario?id={id}(id=${filme.id})}">Editar</a>
                <form action="/filmes" method="post">
                    <input type="hidden" name="_method" value="delete"/>
                    <input type="hidden" name="id" th:value="${filme.id}"/>
                    <input type="submit" value="Excluir"/>
                </form>
            </td>
        </tr>
        </tbody>
    </table>
</div>
</body>
</html>

Erro:

Exception processing template "filmes/formulario": An error happened during template parsing (template: "class path resource [templates/filmes/formulario.html]")

org.thymeleaf.exceptions.TemplateInputException: An error happened during template parsing (template: "class path resource [templates/filmes/formulario.html]")
<REMOVIDO VARIOS at org.spring>
Caused by: org.attoparser.ParseException: Exception evaluating SpringEL expression: "filme.nome" (template: "filmes/formulario" - line 19, col 42)
<REMOVIDO VARIOS at org.spring>
Caused by: org.thymeleaf.exceptions.TemplateProcessingException: Exception evaluating SpringEL expression: "filme.nome" (template: "filmes/formulario" - line 19, col 42)
<REMOVIDO VARIOS at org.spring>
Caused by: org.springframework.expression.spel.SpelEvaluationException: EL1007E: Property or field 'nome' cannot be found on null
<REMOVIDO VARIOS at org.spring>
2023-07-21T19:26:33.846-03:00 ERROR 27692 --- [nio-8080-exec-1] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed: org.thymeleaf.exceptions.TemplateInputException: An error happened during template parsing (template: "class path resource [templates/filmes/formulario.html]")] with root cause
org.springframework.expression.spel.SpelEvaluationException: EL1007E: Property or field 'nome' cannot be found on null

DadosCadastroFilme.java

package br.com.alura.screenmatch.domain.filme;

public record DadosCadastroFilme(String nome, Integer duracao, Integer ano, String genero) {
}

DadosAlteracaoFilme.java

package br.com.alura.screenmatch.domain.filme;

public record DadosAlteracaoFilme(Long id, String nome, Integer duracao, Integer ano, String genero) {
}

formulario.html

<!DOCTYPE html>
<html lang="en"
      xmlns:th="http://thymeleaf.org"
      xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
      layout:decorate="~{template.html}"
>
<head>
    <title>Cadastro de filmes</title>
</head>
<body>
<h1>Cadastro de Filmes</h1>
<div layout:fragment="conteudo">
    <form method="post" action="/filmes">
        <input type="hidden" name="_method" value="put"/>
        <input type="hidden" name="id" value="${filme?.id}"/>

        <div>
            <label for="nome">Nome: </label>
            <input id="nome" name="nome" th:value="${filme.nome}">
        </div>
        <div>
            <label for="duracao">Duração: </label>
            <input id="duracao" name="duracao" th:value="${filme.duracaoEmMinutos}">
        </div>
        <div>
            <label for="ano">Ano de lançamento: </label>
            <input id="ano" name="ano" th:value="${filme.anoLancamento}">
        </div>
        <div>
            <label for="genero">Gênero: </label>
            <input id="genero" name="genero" th:value="${filme.genero}">
        </div>
        <br/>
        <input type="submit" value="Cadastrar">

    </form>
</div>
</body>
</html>

o meu também nao funcionou Rodrigo Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Para corrigir o problema, eu simplesmente declarei a variável como se fazia "antigamente": Filme filme = repository.getReferenceById(id);