Como redirecionar depois de deletar

É o seguinte, tenho uma ficha que possui vários produtos.

A função para alterar fica assim:

    @Put("/produtos/{produto.id}")
    public void altera(@Valid Produto produto){
        validator.onErrorRedirectTo(this).edita(produto.getId());
        produtoDao.atualiza(produto);
        result.redirectTo(FichaController.class).incluir(produto.getFicha().getId());
    }

Ao realizar a atualização ele retorna para a ficha correspondente do produto. (OK)

Mas e para deletar? Como fazer se o produto não existe mais, e consequentemente o id da ficha referente a ele também não. Como fazer esse redirecionamento ?

Após deletar você precisa escolher se envia para a tela inicial ou se envia para uma outra tela.

Eu quero redirecionar para a ficha do produto que foi deletado, meu caro!

Respondo com uma pergunta feita por você mesmo.

Vamos pensar comigo, se você redirecionar para a ficha do produto e o produto não existe mais, das duas uma, ou você está com uma visão bem equivocada a respeito dos requisitos do teu projeto e deletou o produto sem que isso fosse, realmente, requerido ou você vai precisar rever o que esse requisito diz, pois, quando se trata de exclusão física (executar um DELETE), o registro referente ao tal produto deixa de existir imediatamente.
A não ser que a exclusão seja lógica, como inserir um valor à uma coluna como DATA_EXCLUSAO.

1 curtida

Eu acho que entendi o que você disse. Mas eu não estou conseguindo enxergar o que eu devo fazer para resolver esse problema de lógica.

Eu tenho a classe ficha, que possui nome e id.
E a classe produto que é preciso ser relacionada com uma ficha. Na hora do cadastro desse produto eu tenho a opção de escolher qual ficha eu quero.

Eu devo colocar um campo data_exclusao e o ato de deletar pode ser simplesmente remover esse id da ficha?

Existe uma tela onde você exibe a tal ficha, isso?

Essa é a ficha eu preciso que os produtos sejam deletados e retornem pra ela.

Pensei que assim pudesse resolver:

 @Remove
    public void remove(Produto produto) {
        Ficha ficha = produto.getFicha();
        produtoDao.remove(produto);
        result.redirectTo(FichaController.class).incluir(ficha.getId());
    }

outra tentativa:

 @Remove
    public void remove(Produto produto) {
        int fichaId = produto.getFicha().getId();
        produtoDao.remove(produto);
        result.redirectTo(FichaController.class).incluir(fichaId);
    }

mas os dois geram esse erro :

Consegui.
Controller do produto:

@Remove
public void remove(Produto produto) {
   	Produto p = produtoDao.busca(produto);
    Ficha f = p.getFicha();
	produtoDao.remove(produto);
	result.redirectTo(FichaController.class).incluir(f.getId());
}

Dao do produto:

public void remove (Produto produto) {
    manager.getTransaction().begin();
    produto = busca(produto);
    manager.remove(produto);
    manager.getTransaction().commit();
}

public Produto busca (Produto produto) {
	return manager.find(Produto.class, produto.getId());
}