Dúvida Formulário VRaptor2 + Hibernate

3 respostas
A

Pessoal,

Estou precisando que após o preenchimento de um formulário, caso haja algum erro de validação e no momento do retorno a mesma página do formulário, as informações anteriormente digitadas sejam carregadas de volta. Tentei jogar o objeto para a session, e consegui, porém quando tem alguma invalidação ele não gava a informação. Espero que alguém possa me ajudar!

Estou colocando o código do componente de lógica e o modelo abaixo para facilitar:

@Component(programa)

@InterceptedBy( { AutorizadorInterceptor.class, DaoInterceptor.class })

public class ProgramaLogic {

private final DaoFactory daoFactory;
@In(scope = ScopeType.SESSION, key = "programa", required = false)
@Out(scope = ScopeType.SESSION, key = "programa")
private Programa programa;
private List<Programa> programas;

public ProgramaLogic(DaoFactory daoFactory) {
	this.daoFactory = daoFactory;
}

// formulario para adicao
public void formulario() {
}

// formulario para edicao
public void editar(Programa programa) {
	// carrega os dados no banco para edicao
	this.programa = (Programa) this.daoFactory.getProgramaDao().procura(
			programa.getId());
}

// Adiciona um programa novo ou atualiza se for edicao
public void armazena(Programa programa) {
	this.programa = programa; // Armazena na session o que foi digitado
	programa = this.valida(programa); // Chama o método para validação
	this.daoFactory.beginTransaction(); // Inicia a inclusão no Banco
	this.daoFactory.getProgramaDao().atualiza(programa);
	this.daoFactory.commit(); // Finaliza a inclusão no Banco
	this.programa = null; // Destroy a session
}

// Valida todos os parâmetros do instância programa
@Validate(params = { "programa" })
public Programa valida(Programa programa) {
	return programa;
}

// remove um programa
public void remove(Programa programa) {
	this.daoFactory.beginTransaction();
	this.daoFactory.getProgramaDao().remove(programa);
	this.daoFactory.commit();
}

// lista todos os programas
public void lista() {
	this.programas = this.daoFactory.getProgramaDao().listaTudo();
}

// getter pro programa
public Programa getPrograma() {
	// if (tPrograma.getId() != null)
	// programa = tPrograma;
	return programa;
}

// getter pra lista de programas
public List<Programa> getProgramas() {
	return programas;
}

}

@Entity

public class Programa {

@Id

@GeneratedValue

private Short id;

@Length(max = 20)

private String titulo;

@Length(max = 50)

private String descricao;
private char status;
private Calendar dtInicio;
private Calendar dtPrevTermino;
private Calendar dtTermino;
private int qtdeMaxProjetos;

    ...getters e setters...

}

Abraços!

João Attila

3 Respostas

P

Vc tem que criar um método chamado “validadeArmazena” que o vRaptor vai chamar automaticamente quando vc chamar o método “armazena”, dentro do “validadeArmazena” vc tem que atribuir ao atributo programa o objeto recebido como parâmetro e a colocação do “@Validate” tem que ser no método “armazena” e não ha necessidade do método “valida”.
Pelo jeito vc ta chamando o método “valida” agora isso não precisa mais, chame diretamente o método “armazena”, deve ficar assim:

@Validate(params = { programa })

public void armazena(Programa programa) {

this.programa = programa; // Armazena na session o que foi digitado

programa = this.valida(programa); // Chama o método para validação

this.daoFactory.beginTransaction(); // Inicia a inclusão no Banco

this.daoFactory.getProgramaDao().atualiza(programa);

this.daoFactory.commit(); // Finaliza a inclusão no Banco

this.programa = null; // Destroy a session

}
public void validateArmazena(ValidationErrors errors, Programa programa) {

this.programa = programa;

}

[color=red]

*** APAGAR ***

@Validate(params = { programa })

public Programa valida(Programa programa) {

return programa;

}

[/color]

Outra coisa, vc não precisa colocar o atributo “programa” na sessão:

[color=red]

*** APAGAR ***

@In(scope = ScopeType.SESSION, key = programa, required = false)

@Out(scope = ScopeType.SESSION, key = programa)

[/color]

private Programa programa;
A

Putz! Verdade! o método validateArmazena() é o método chamado antes do armazena(), dai lá só preciso atribuir a variável de instância o que veio pelo request!!! Eu querendo um framework que use convenção e não tou usando convenção! hehhehehe

Cara! Muito obrigado mesmo! Resolveu 30% dos problemas que estou tendo neste projeto :wink:

Abraços!

João Attila

Fabio_Kung

Oi Attila,

O que o pbnf disse está perfeito!

Eu só tenho mais duas dicas:

[list]não precisa do @Out, basta você criar o getter[/list]
[list]frequente o fórum do vraptor: http://www.vraptor.com.br/forum[/list]

Criado 30 de agosto de 2007
Ultima resposta 30 de ago. de 2007
Respostas 3
Participantes 3