Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Dúvidas com onErrorRedirecTo, onErrorFowardTo, OnerrorUse

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>
2 respostas
solução!

Opa, onRedirectTo força um redirect no lado do cliente, enquanto que o onErrorFowardTo força um redirect apenas no lado do servidor, em caso de erro claro. Na verdade seu código parece correto.

Pois é, estranho, o onFowardTo parece está se comportando como um redirect, se eu por exemplo apagar o nome do produto e mandar salvar ele coloca novamente o nome original do produto, mas enfim, deve ser alguma doidera do eclipse que só a fé pode explicar pois acabei de checar aqui em outro projeto e está funcionando da forma que gostaria. Obrigado!