Como alterar somente os campos passados pelo formulário utilizando vraptor3?

8 respostas
V

Pessoal, estou com um problemão aqui! Como alterar somente os campos passados como parâmetro pelo formulário utilizando vraptor 3?
Exemplo: Se eu tenho uma tabela pessoas que possuem vários atributos como: nome, endereço, cpf, login e senha, mas eu só quero alterar a senha desta pessoa,
como eu devo proceder para que o vraptor não atribua null aos outros campos (nome, endereço, cpf e login) que não estão no formulário de edição da senha?

8 Respostas

Lucas_Cavalcanti

a abordagem padrão é fazer algo do tipo:

public void alteraSenha(Usuario usuario) {
    Usuario persistente = dao.load(usuario.getId());
    persistente.setSenha(usuario.setSenha());
    //quaisquer outros dados q vc recebeu no formulário
    dao.atualiza(persistente); //no hibernate essa linha é desnecessária
}

não existe um jeito mto seguro de fazer isso automaticamente (vc pode mto bem passar usuario.nome=Pafuncio na requisição, mesmo q ele não esteja no formulario)…

mas vc pode criar um objeto que consegue copiar propriedades de um objeto pro outro, passando os nomes dessas propriedades…

V

Beleza Lucas, isso resolve o problema. Eu achava que teria uma maneira mais legal de fazer isso utilizando o vraptor, tipo atribuindo a entidade Pessoa somente o campo passado pelo formulário e o restante dos atributos continuando a ficar como estavam. Mas obrigado aí pela dica!

Lucas_Cavalcanti

a gente tah com planos pra fazer algo assim…
tipo uma anotação que vc fale pro vraptor carregar o parâmetro do banco antes de popular os parâmetros…

mas a gente precisa ainda definir qual seria a usabilidade disso… é meio difícil deixar genérico…

V

Lucas, eu não sei como o vraptor faz para atribuir os campos passados no formulário para o objeto de destino, mas seria muito interessante se o vraptor pudesse comparar os parâmetros passados no formulário com os parâmetros do objeto, assim ele atribuiria somente aqueles que estivessem no formulário. Exemplo:

public class Pessoas{
    private nome;
    private cpf;
    private endereco;
    private bairro;

    //métodos getters e setters

}

E o fomulário

...
<form "<c:url value="url_de_destino">" method="POST">

    <input type="text" name="pessoa.nome">

    <button type="submit"/>

</form>

Neste código o formulário só alteraria o campo NOME da pessoa, o resto ficando como estava antes.

G

Lucas Cavalcanti:
a gente tah com planos pra fazer algo assim…
tipo uma anotação que vc fale pro vraptor carregar o parâmetro do banco antes de popular os parâmetros…

mas a gente precisa ainda definir qual seria a usabilidade disso… é meio difícil deixar genérico…

Ou seja, uma funcionalidade para tapar uma gambiarra difundida de jogar as entidades persistentes para a camanda web.

Mesmo eu achando a idéia beirando o absurdo, vamos pensar que você não tem como saber de onde vem o objeto, e também o que você deve “setar” ou não. Você não tem como saber se o campo existe não não no formulário. Se você considerar null como algo que não está no formulário, como você pode saber se é intencional deixar um objeto como nulo, por exemplo, um objeto antes tinha idade e agora não tem mais? E se a propriedade for um relacionamento, como saber como buscar ele?

Lucas_Cavalcanti

vilsonei:
Lucas, eu não sei como o vraptor faz para atribuir os campos passados no formulário para o objeto de destino, mas seria muito interessante se o vraptor pudesse comparar os parâmetros passados no formulário com os parâmetros do objeto, assim ele atribuiria somente aqueles que estivessem no formulário.

Não tem como o VRaptor saber, dentro da requisição, quais campos vieram do formulário… dá pra saber só os parâmetros que vieram na requisição,
que não precisam necessariamente vir do formulário…

não dá pra fazer isso que vc quer genericamente…
o vraptor precisa saber qual é o id do objeto, carregar o objeto do banco, e só depois popular os parâmetros…
mas e o que acontece se vc precisa validar esses campos populados? vc já colocou isso no objeto persistente… se vc só
dar o erro de validação, o vraptor não vai dar rollback das alterações, e seu objeto vai ficar inconsistente…

enfim, tem mtos problemas pra fazer isso… o melhor seria vc controlar o que vc quer receber no formulario manualmente mesmo,
pelo menos por enquanto…

Lucas_Cavalcanti

garcia-jj:
Lucas Cavalcanti:
a gente tah com planos pra fazer algo assim…
tipo uma anotação que vc fale pro vraptor carregar o parâmetro do banco antes de popular os parâmetros…

mas a gente precisa ainda definir qual seria a usabilidade disso… é meio difícil deixar genérico…

Ou seja, uma funcionalidade para tapar uma gambiarra difundida de jogar as entidades persistentes para a camanda web.

Mesmo eu achando a idéia beirando o absurdo, vamos pensar que você não tem como saber de onde vem o objeto, e também o que você deve “setar” ou não. Você não tem como saber se o campo existe não não no formulário. Se você considerar null como algo que não está no formulário, como você pode saber se é intencional deixar um objeto como nulo, por exemplo, um objeto antes tinha idade e agora não tem mais? E se a propriedade for um relacionamento, como saber como buscar ele?

a idéia inicial dessa funcionalidade é evitar códigos do tipo:

public void logica(Entidade entidade) {
    Entidade persistente = dao.load(entidade.getId());

    //alguma lógica aqui usando a entidade persistente
}

esse código é bastante comum, e útil em lógicas que só recebemos o id da entidade, na maioria das vezes por parâmetros da uri
( /dvds/234/copies por exemplo )

Wendell_Albino

Lucas Cavalcanti:
a abordagem padrão é fazer algo do tipo:

public void alteraSenha(Usuario usuario) {
    Usuario persistente = dao.load(usuario.getId());
    persistente.setSenha(usuario.setSenha());
    //quaisquer outros dados q vc recebeu no formulário
    dao.atualiza(persistente); //no hibernate essa linha é desnecessária
}

não existe um jeito mto seguro de fazer isso automaticamente (vc pode mto bem passar usuario.nome=Pafuncio na requisição, mesmo q ele não esteja no formulario)…

mas vc pode criar um objeto que consegue copiar propriedades de um objeto pro outro, passando os nomes dessas propriedades…

Estava pesquisando neste fórum e encontrei um pequeno erro:

public void alteraSenha(Usuario usuario) {
    Usuario persistente = dao.load(usuario.getId());
    //persistente.setSenha(usuario.setSenha()); esta linha tem um pequeno erro
   persistente.setSenha(usuario.getSenha()); // esta é a forma correta!
    //quaisquer outros dados q vc recebeu no formulário
    dao.atualiza(persistente); //no hibernate essa linha é desnecessária
}
Criado 29 de junho de 2010
Ultima resposta 5 de ago. de 2012
Respostas 8
Participantes 4