[Resolvido] objetos somem da página quando dá erro de validação

6 respostas
N

Galera eu acho que é burrice minha, mas vou perguntar… seguinte, tenho um controller e tenho um método pra abrir uma entidade pra edição e um pra fazer a edição.

@Get @Path("/categorias/{id}/")
	public Categoria editar(Long id) {
		result.include("categorias", repositorio.listar()); // lista de categorias pra preencher uma select
		return repositorio.carregar(id);
	}
	
	@Put @Path("/categorias/{categoria.id}/")
	@Permissao({TipoPerfil.ADMIN, TipoPerfil.GERENTE})
	public void alterar(Categoria categoria) {
		Categoria categoriaBD = repositorio.carregar(categoria.getId());
		validator.validate(categoria); //aqui vai  erro
		validator.onErrorUsePageOf(this).editar(categoria.getId()); //eu devo usar outra coisa aqui?
		BeanUtils.copyProperties(categoria, categoriaBD);
		result.include("message", "Categoria foi alterada com sucesso");
		result.redirectTo(this).listar();
	}

quando eu abro a entidade pra editar, a combo vai ser preenchida com os dados de “categorias”, porém quando eu submeto e acontece um erro de validação daí a combo fica vazia. Se eu usar onErrorForwardTo eu perco os dados que o usuário digitou… o que eu devo fazer? Carregar de novo a lista não né? Ai é p@#$@# :slight_smile: agradeço a quem puder me ajudar. valeu.

6 Respostas

Lucas_Cavalcanti

troque o onErrorUsePageOf (que só vai direto pra jsp) por onErrorForwardTo (que executa o método)

o forwardTo não perde tudo que o usuário digitou, mas vc precisa fazer o código para manter os dados (ex. )

N

o problema é que quando eu executo o editar(id) novamente ele carrega o objeto do banco e preenche os dados na tela, por isso eu falei que perde os dados que o usuário digitou. Nesse caso como eu faria? Eu teria que verificar se já foi carregado ou algo do tipo?

Lucas_Cavalcanti

ah, entendi…

o que vc pode fazer é usar o onErrorUsePageOf, e chamar o método de verdade:

validator.validate(categoria);
if (validator.hasErrors()) // use o if se vc quiser economizar as idas ao banco caso tudo dê certo
     edita(categoria.getId());
validator.onErrorUsePageOf(this).edita(categoria.getId());
N

mas o problema vai continuar, pq ele vai lá no edita daí carregar a Categoria do banco novamente… aí eu perco o que o usuário digitou :frowning: Eu fiz o seguinte: se der erro de validação eu carrego as entidades que preenchem os combo…

public void alterar(Categoria categoria) {
		Categoria categoriaBD = repositorio.carregar(categoria.getId());
		preencherPropriedadesTransientes(categoria);
		validator.validate(categoria);
		if (validator.hasErrors()) {
			result.include("categorias", repositorio.listar());
		}
		validator.onErrorUsePageOf(this).editar(categoria.getId());

Se é feio não sei… mas funcionou :slight_smile:

Lucas_Cavalcanti

o problema não vai continuar, pois se vc executa o método diretamente (sem usar o vraptor), o retorno do método não é incluido no result

N

Ah é verdade, tem razão. Funcionou. Valeu lucas.

Criado 13 de junho de 2011
Ultima resposta 14 de jun. de 2011
Respostas 6
Participantes 2