Ни BindingResult, ни простой целевой объект для имени компонента «клиент» не доступны в качестве атрибута запроса - PullRequest
0 голосов
/ 27 декабря 2018

У меня проблема с пружиной и тимелистом, я пытаюсь заполнить форму данными от объекта, называемого клиентом, но я получаю сообщение об ошибке Whitelabel Page в браузере и это сообщение в консоли

Neither BindingResult nor plain target object for bean name 'cliente' available as request attribute

это клиент

package com.bolsadeideasspringboot.app.models.entity;
import java.io.Serializable;
import java.util.Date;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.validation.constraints.Email;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import org.springframework.format.annotation.DateTimeFormat;

@Entity
@Table(name="clientes")
public class Cliente implements Serializable{

    /**
     * 
     */
    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    @NotEmpty
    private String nombre;
    @NotEmpty
    private String apellido;
    @NotEmpty
    @Email
    private String email;
    @Column(name="create_at")
    @Temporal(TemporalType.DATE)
    @DateTimeFormat(pattern="dd/MM/yyyy")
    private Date createAt;


    public Long getId() {
        return id;
    }
    public void setId(Long id) {
        this.id = id;
    }
    public String getNombre() {
        return nombre;
    }
    public void setNombre(String nombre) {
        this.nombre = nombre;
    }
    public String getApellido() {
        return apellido;
    }
    public void setApellido(String apellido) {
        this.apellido = apellido;
    }
    public String getEmail() {
        return email;
    }
    public void setEmail(String email) {
        this.email = email;
    }
    public Date getCreateAt() {
        return createAt;
    }
    public void setCreateAt(Date createAt) {
        this.createAt = createAt;
    }

}

это метод контроллера

@RequestMapping(value="/form/{id}")
    public String editar(@ModelAttribute("form") @PathVariable(value="id")Long id, Map<String, Object>model) {
    Cliente cliente = null;

    if(id > 0) {
        clientedao.findOne(id);
        model.put("cliente", cliente);
        model.put("titulo", "Editar Cliente");
        return "form";
    }
    else {
        return "redirect:/listar";
    }

}

это метод ClienteDaoImpl.java

@Override
public Cliente findOne(Long id) {
    // TODO Auto-generated method stub
    return em.find(Cliente.class, id);
}

это метод интерфейса Dao

public Cliente findOne(Long id);

и это форма

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8" />
    <title th:text="${titulo}">Insert title here</title>
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">

</head>
<body>

    <div class="container">

        <div class="row">
            <div class="col-md-4 col-md-offset-3">
                <h1 class="text-success" th:text="${titulo}"></h1>
                <form th:action="@{/form}" th:object="${cliente}" method="post">

                    <div class="form-group">
                        <label>Nombre</label>
                        <input class="form-control" type="text" th:field="*{nombre}" placeholder="Nombre"/>
                        <small class="form-text text-danger" th:if="${#fields.hasErrors('nombre')}" th:errors="*{nombre}"></small>
                    </div>

                    <div class="form-group">    
                        <label>Apellido</label>
                        <input class="form-control" type="text" th:field="*{apellido}" placeholder="Apellido"/>
                        <small class="form-text text-danger" th:if="${#fields.hasErrors('apellido')}" th:errors="*{apellido}"></small>
                    </div>
                    <div class="form-group">    
                        <label>Email</label>
                        <input class="form-control" type="text" th:field="*{email}" placeholder="correo@ejemplo.com"/>
                        <small class="form-text text-danger" th:if="${#fields.hasErrors('email')}" th:errors="*{email}"></small>
                    </div>
                    <div class="form-group">    
                        <label>Fecha</label>
                        <input class="form-control" type="text" th:field="*{createAt}" placeholder="DD/MM/YYYY"/>
                        <small class="form-text text-danger" th:if="${#fields.hasErrors('createAt')}" th:errors="*{createAt}"></small>
                    </div>  
                    <div class="form-group">    
                        <input class="btn btn-primary" type="submit" value="Crear Cliente" />
                    </div>

                    <input type="hidden" th:field="*{id}" />
                </form>
            </div>
        </div>
    </div>

</body>
</html>

Я устанавливаю клиентуру в методе контроллера, и я использую th: object вформа, так что я не знаю, что я делаю неправильно, любая помощь будет полезна, спасибо в совете

1 Ответ

0 голосов
/ 27 декабря 2018

Вместо put(), попробуйте использовать рекомендуемый подход для добавления объекта в вашу модель с помощью

model.addAttribute("cliente", clientedao.findOne(id));

. Как правило, вы также хотите использовать @GetMapping для своих запросов.заполнить форму.И используйте @PostMapping для представления.

В сторону: также взгляните на Project Lombok, чтобы сделать ваши компоненты менее подверженными ошибкам и более читабельными.Вы можете удалить все эти методы получения и установки и просто аннотировать класс с помощью @Data.

Хотя это не устарело, вы также можете отказаться от использования java.util.Date и использовать более новые классы даты / времени.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...