3
respostas

Validar empty filds no request

Boa noite, É possível validar campos vazios de um form ? Seguindo os passos do spring.io (https://spring.io/guides/gs/validating-form-input/) eu cheguei nessa solução: Model:

package br.com.springboot.listavip.model;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.validation.constraints.NotNull;

@Entity(name= "convidado")
public class Convidado {

@Id
    @GeneratedValue
    private Long id;

    @NotNull
    private String nome;
    @NotNull
    private String email;
    @NotNull
    private String telefone;

 //ggas
}

Controller:

package br.com.springboot.listavip;

import javax.validation.Valid;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;

import br.com.springboot.listavip.model.Convidado;
import br.com.springboot.listavip.repository.ConvidadoRepository;

@Controller
public class ConvidadoController{

    @Autowired
    private ConvidadoRepository repository;

    @RequestMapping("/")
    public String index(){
        return "index";
    }

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

        Iterable<Convidado> convidados = repository.findAll();
        model.addAttribute("convidados", convidados);
        return "listaconvidados";
    }

    @RequestMapping(value= "salvar", method = RequestMethod.POST)
    public String salvar(@Valid Convidado novoConvidado, BindingResult bindingResult){

        if (bindingResult.hasErrors()) {
            return "redirect:listaconvidados";
        }
        repository.save(novoConvidado);
        return "redirect:listaconvidados";
    }

    @RequestMapping("/informaConvidado{id}")
    public String informaConvidado(@RequestParam("id") long id, Model model){
        Convidado convidado = repository.findOne(id);
        model.addAttribute("convidado", convidado);

        return "redirect:listaconvidados";
    }

    @RequestMapping(value= "/remover{id}", method = RequestMethod.GET)
    public String removeConvidado(@RequestParam(name="id") Long id){

        repository.delete(id);

        return "redirect:listaconvidados";
    }

}

Form:

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    <title>ListaVIP</title>
    <link href="bootstrap/css/bootstrap.min.css" rel="stylesheet" />
</head>
<body>
<div class="container">
<div id="listaDeConvidados">
    <table class="table table-hover">
        <thead>
        <tr>
            <th>Nome</th>
            <th>Email</th>
            <th>telefone</th>
            <th> </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>
            <td> 
                <a th:href="@{/remover(id=${convidado.id})}" class="btn btn-danger">Delete</a>
            </td>
        </tr>
    </table>
</div>
<form action="#" th:action="@{salvar}" th:object="${novoConvidado}" method="post" >
    <div class="form-group">
        <label for="nome">Nome</label>
        <input type="text" th:field="*{nome}" class="form-control" id="nome" name="nome" placeholder="Nome" />
        <label th:if="${#fields.hasErrors('nome')}" th:errors="*{nome}">Name Error</label>
    </div>
    <div class="form-group">
        <label for="email">Email</label>
        <input type="email" class="form-control" id="email" name="email" placeholder="Email" />
    </div>
    <div class="form-group">
        <label for="telefone">Telefone</label>
        <input type="text" class="form-control" id="telefone" name="telefone" placeholder="Telefone" />
    </div>

    <button type="submit" class="btn btn-success">Convidar</button>
</form>
</div>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>
<script src="bootstrap/js/bootstrap.min
3 respostas

Eis o erro que recebo:

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

Fri Oct 19 01:59:32 BRT 2018
There was an unexpected error (type=Internal Server Error, status=500).
Error during execution of processor 'org.thymeleaf.spring4.processor.attr.SpringInputGeneralFieldAttrProcessor' (listaconvidados:33)

no console:

java.lang.IllegalStateException: Neither BindingResult nor plain target object for bean name 'novoConvidado' available as request attribute
    at org.springframework.web.servlet.support.BindStatus.<init>(BindStatus.java:144) ~[spring-webmvc-4.3.4.RELEASE.jar:4.3.4.RELEASE]
    at org.thymeleaf.spring4.util.FieldUtils.getBindStatusFromParsedExpression(FieldUtils.java:401) ~[thymeleaf-spring4-2.1.5.RELEASE.jar:2.1.5.RELEASE]
    at org.thymeleaf.spring4.util.FieldUtils.getBindStatus(FieldUtils.java:328) ~[thymeleaf-spring4-2.1.5.RELEASE.jar:2.1.5.RELEASE]
    at org.thymeleaf.spring4.util.FieldUtils.getBindStatus(FieldUtils.java:294) ~[thymeleaf-spring4-2.1.5.RELEASE.jar:2.1.5.RELEASE]
    at org.thymeleaf.spring4.processor.attr.AbstractSpringFieldAttrProcessor.processAttribute(AbstractSpringFieldAttrProcessor.java:98) ~[thymeleaf-spring4-2.1.5.RELEASE.jar:2.1.5.RELEASE]
    at org.thymeleaf.processor.attr.AbstractAttrProcessor.doProcess(AbstractAttrProcessor.java:87) ~[thymeleaf-2.1.5.RELEASE.jar:2.1.5.RELEASE]
    at org.thymeleaf.processor.AbstractProcessor.process(AbstractProcessor.java:212) ~[thymeleaf-2.1.5.RELEASE.jar:2.1.5.RELEASE]
    at org.thymeleaf.dom.Node.applyNextProcessor(Node.java:1017) ~[thymeleaf-2.1.5.RELEASE.jar:2.1.5.RELEASE]
    at org.thymeleaf.dom.Node.processNode(Node.java:972) ~[thymeleaf-2.1.5.RELEASE.jar:2.1.5.RELEASE]
    at org.thymeleaf.dom.NestableNode.computeNextChild(NestableNode.java:695) ~[thymeleaf-2.1.5.RELEASE.jar:2.1.5.RELEASE]
    at org.thymeleaf.dom.NestableNode.doAdditionalProcess(NestableNode.java:668) ~[thymeleaf-2.1.5.RELEASE.jar:2.1.5.RELEASE]
    at org.thymeleaf.dom.Node.processNode(Node.java:990) ~[thymeleaf-2.1.5.RELEASE.jar:2.1.5.RELEASE]
    at org.thymeleaf.dom.NestableNode.computeNextChild(NestableNode.java:695) ~[thymeleaf-2.1.5.RELEASE.jar:2.1.5.RELEASE]
    at org.thymeleaf.dom.NestableNode.doAdditionalProcess(NestableNode.java:668) ~[thymeleaf-2.1.5.RELEASE.jar:2.1.5.RELEASE]
    at org.thymeleaf.dom.Node.processNode(Node.java:990) ~[thymeleaf-2.1.5.RELEASE.jar:2.1.5.RELEASE]
    at org.thymeleaf.dom.NestableNode.computeNextChild(NestableNode.java:695) ~[thymeleaf-2.1.5.RELEASE.jar:2.1.5.RELEASE]

Oi Leandro, tudo bem?

No Controller, você precisa adicionar o objeto de Convidado como um atributo do model:

model.addAttribute("novoConvidado", new Convidado());

Abraço!

Oi Otávio, tudo ótimo, e ae?

Com a sua ajuda consegui resolver os erros ao subir o form. Ao tentar submeter um form com campo vazio ele bloqueia porém não envia nenhuma mensagem de erro... Com o sysout eu confirmei que ele entra no (bindingResult.hasErrors)... Simplesmente a mensagem de erro não retorna para a view... Sabe o que pode ser? Segue meu novo código:

<form action="#" th:action="@{salvar}" th:object="${novoConvidado}" method="post" >
    <div class="form-group">
        <label for="nome">Nome</label>
        <label th:if="${#fields.hasErrors('nome')}" th:errors="*{nome}">Name Error</label>
        <input type="text" th:field="*{nome}" class="form-control" id="nome" name="nome" placeholder="Nome" />

    </div>
    <div class="form-group">
        <label for="email">Email</label>
        <label th:if="${#fields.hasErrors('email')}" th:errors="email">Name Error</label>
        <input type="email" class="form-control" id="email" name="email" placeholder="Email" />
    </div>
    <div class="form-group">
        <label for="telefone">Telefone</label>
        <label th:if="${#fields.hasErrors('telefone')}" th:errors="telefone">Name Error</label>
        <input type="text" class="form-control" id="telefone" name="telefone" placeholder="Telefone" />
    </div>

    <button type="submit" class="btn btn-success">Convidar</button> 
    <label><span th:text="${erro}"></span> </label>
</form>

CONTROLLER:

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

        Iterable<Convidado> convidados = repository.findAll();
        model.addAttribute("novoConvidado", new Convidado());
        model.addAttribute("convidados", convidados);

        return "listaconvidados";
    }

    @RequestMapping(value= "salvar", method = RequestMethod.POST)
    public String salvar(@Valid Convidado novoConvidado, BindingResult bindingResult, Model model){

        if (bindingResult.hasErrors()) {

            System.out.println("TEVE ERROOOO");

            model.addAttribute("novoConvidado", novoConvidado);
            return "redirect:listaconvidados";
        }

        repository.save(novoConvidado);
        return "redirect:listaconvidados";
    }