Olá a todos, me ajudem com essa dúvida de iniciante. Tenho um crud simples, no momento de salvar o produto, se existir algum erro, eu redireciono para a página de cadastro de novo produto, até ai tudo certo.
Mas e quando estou na página de edição? Se eu uso o onErrorRedirectTo, ele não vai manter os valores no formulário, pois como esperado ele vai recarregar o objeto e colocar os dados originais do objeto. Com o onErrorFowardTo tive o mesmo resultado que com o redirect e com o onErrorUsePageOf, ele não carraga os outros dados para alimentar a combobox. O melhor resultado que tive foi com o validator.onErrorRedirectTo(this).formulario(), redirecionando para a página de adição e não de edição, os dados continuam no form, mas para o usuário fica estranho pois a url muda para /produtos/novo.
então gostaria de saber um pouco mais sobre os métodos onErrorRedirecTo, onErrorFowardTo, OnerrorUse e qual o ideal deles para usar na validação nas telas de alteração
@Controller
public class ProdutoController {
@Inject
private Result result;
@Inject
private ProdutoDao dao;
@Inject
private CategoriaDao cdao;
@Inject
private Validator validator;
@Get("/produtos")
public void lista(){
result.include("produtoList",dao.lista());
}
@Get("/produtos/novo")
public void formulario(){
result.include("categoriaList",cdao.todas());
}
@Get("/produtos/{id}")
public void formulario(Long id){
result.include("categoriaList",cdao.todas());
result.include(dao.recupera(id));
}
@Post("/produtos")
public void salvar(@Valid Produto produto){
validator.onErrorRedirectTo(this).formulario();
produto = dao.adiciona(produto);
result.redirectTo(this).lista();
}
@Put("/produtos")
public void alterar(@Valid Produto produto){
//validator.onErrorRedirectTo(this).formulario(produto.getId());
//validator.onErrorForwardTo(this).formulario(produto.getId());
//validator.onErrorUsePageOf(this).formulario(produto.getId());
validator.onErrorRedirectTo(this).formulario();
result.redirectTo(this).lista();
}
@Delete("/produtos/remove")
public void delete(Produto produto){
dao.remove(produto);
result.redirectTo(this).lista();
}
}
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<c:forEach var="error" items="${errors}">
${error.category} - ${error.message}<br />
</c:forEach>
<form method="post" action="<c:url value="/produtos"/>">
<c:if test="${not empty produto.id}">
<input type="hidden" name="produto.id" value="${produto.id}">
<input type="hidden" name="_method" value="PUT">
</c:if>
Nome <input type="text" name="produto.nome" value="${produto.nome}" /><br />
Categoria <select name="produto.categoria" id="categoria">
<c:forEach var="categoria" items="${categoriaList}">
<option
<c:if test="${produto.categoria.id == categoria.id}" >selected</c:if>
value="${categoria.id}">${categoria.nome}</option>
</c:forEach>
</select><br /> Quantiadade <input type="text" name="produto.quantidade"
value="${produto.quantidade}" /><br /> Valor <input type="text"
name="produto.valor" value="${produto.valor}" /><br /> <input
type="submit" value="Enviar" />
</form>
</body>
</html>