Como fazer o bind do request direto com objeto de dominio de maneira elegante
08/07/2013 04:07
0
Ola, em grails vi que temos os Command Objects que acho que muitas vezes duplica o codigo de validaçao com os objetos de dominios, gostaria de saber se alguém sabe como fazer no grails , o bind do request com a classe de dominio como no vraptor segue o exemplo

<form action="<c:url value='/produtos/adiciona'/>">
Nome: <input type="text" name="produto.nome" /><br/>
Descrição: <input type="text" name="produto.descricao" /><br/>
Preço: <input type="text" name="produto.preco" /><br/>
<input type="submit" value="Salvar" />
</form>

@Resource
public class ProdutosController {
//...
public void adiciona(Produto produto) {
dao.adiciona(produto);
}
}
fonte http://vraptor.caelum.com.br/pt/docs/guia-de-dez-minutos/

vi algo do estilo

metodo (){
Objeto objeto = new Objeto(params)
}
que achei bem ridiculo por acaso
Tags: grails groovy java


0
Não entendi direito o porque é ridículo ?


Objeto objeto = new Objeto(params)
08/07/2013 12:11


-1
Por que o framework tem que fazer isso é o minimo que se espera que ele faça, por que vou fazer NEW objeto sendo que no form esta usuario.senha e eu recebo um usuario no metodo cade o IOC???

não quero ter que fazer new sendo que o proprio framework pode fazer é uma linha totalmente inutil
Objeto objeto = new Objeto(params) e obvia, claro que o framework tem que chamar o metodo validate do objeto antes de popula-lo, caso alguma informação esteja invalida deve pedir a correta pra o usuario reaproveitando a validação do dominio quando nescessario.


1
Oi Bruno,

os command objects na realidade são para serem usados em raríssimas situações: são casos nos quais a validação vai além do que está presente na classe de domínio.

Com relação ao conceito de IoC. No caso das classes de domínio, estas não são neste momento, pelo controlador, gerenciadas pelo container de inversão de dependências (aliás, nem devem). Você deve pensar da seguinte maneira: há alguma forma do controlador saber que a ação a ser executada será a de persistência de dados a priori? Na maior parte dos casos, não, a não ser que haja alguma convenção estipulada no framework, que pode, muitas vezes, acabar engessando o modo de trabalho.

No caso do VRaptor, este é um framework que, até aonde sei, é baseado no Spring MVC (se não for e eu estiver errado, o funcionamento é o mesmo). No caso do Spring, você tem actions que correspondem às actions no Grails, porém são tipadas.

Então você vai ver assinaturas como


public void adiciona(Produto produto) {

}


cujos atributos do parâmetro irão corresponder aos dos campos presentes no seu formulário. No caso, o próprio Spring/VRaptor faz a instanciação do objeto a partir das convenções propostas em assinaturas de métodos, anotações, etc.

E sabe o que é legal? Da pra fazer a mesma coisa no Grails a partir da versão 2.0 (estamos na 2.2.3 atualmente) já há algo bastante similar. Recomendo que você dê uma lida neste link:
http://grails.org/doc/latest/guide/theWebLayer.html#controllers

O objeto params também é bastante tranquilo de se lidar. Nele você obtém todos os parâmetros da requisição. Sugiro que você dê uma lida nesta seção da documentação (é bem pequena), que deve te ajudar bastante: http://grails.org/doc/latest/guide/theWebLayer.html#dataBinding

A palavra ridícula é inadequada para a solução acima que você criticou. Na realidade, é usado o mesmíssimo esquema de binding do Spring por baixo dos panos, só que de outra forma. Se diferente for ridículo, bom: mais ainda seria não ler a documentação e chegar metendo o ferro comparando com aquilo que já conhece, não é mesmo? ;)


0
Eu ja li a documentação e esses links, pesquisei a fundo antes de falar por acaso e inclusive tem uma thread que abri no http://stackoverflow.com/questions/17519006/how-bind-resquest-to-domain-class-in-grails
que no caso um cara respondeu, la a mesma coisa que o pedro henrique por aqui, que não tem como, o caso é que eu queria saber se tinha alguma forma, ou se alguém implementou esse binding simplesmente isso , pois estou trabalhando profissionalmente com grails e naturalmente busco as melhores soluções, "nenhuma dessas coisas parecidas" da documentação realiza o que eu esperava que era algo tão simples, postei aqui justamente por isso a palavra ridiculo foi usada por que um framework novo, com uma linguagem nova eu achei que realmente eu não estava sabendo fazer.

Se voces não acham que ter que fazer isso

metodo (){
Objeto objeto = new Objeto(params)
}

ao inves disso que


metodo(Object obj){

}

que é a exatamente a mesma coisa digitando a mais para isso, dando new passando os parametros o que caracteriza boilerplate code, e henrique não é metendo o ferro é que desde que parei de ser "xita com java e defender minha linguagem a qualquer custo sem reconhecer limitações" resolvi estudar outras linguagens tentar usar as ferramentas de forma correta, agora que estou trabalhando com grails, eu busco ser critico e pesquisar bastante para ver se sou eu que estou fazendo errado ou a ferramenta tem uma limitação

se foi mto "agressivo" não era a intenção, so que quando postei isso ontem eu realmente achei zuado eu ter perdido horas procurando algo tão simples, algo que eu aceitaria em java ou jsf, porém esperava mais flexibilidade de algo relativamente novo e inovador como grails.






0
Bruno eu apenas perguntei o porque era ridículo(porque não acho), e através do DataBinding eu posso coletar as informações e escolher o que quero fazer com elas pois nem sempre as coisas acontecem neste padrão aí "Scaffold" Form -> Operação de crud(e para apenas um objeto e/ou filho do obj citado).
09/07/2013 11:02


0
eh verdade nem sempre acontece assim o senti falta de ter essa opção



Ainda não faz parte da comunidade???

Para se registrar, clique aqui.


Aprenda Groovy e Grails com a Formação itexto!

Newsletter Semana Groovy

Assinar

Envie seu link!


Livro de Grails


/dev/All

Os melhores blogs de TI (e em português) em um único lugar!

 
Creative Commons
RSS Grails Brasil é mantido por itexto Consultoria.
Em caso de problemas contacte Henrique Lobo Weissmann (Kico) por e-mail: kico@itexto.com.br
Todo o conteúdo presente neste site adota o Creative Commons como licença padrão.
Ver: 4.14.0
itexto