{"id":739,"date":"2010-08-01T12:57:43","date_gmt":"2010-08-01T15:57:43","guid":{"rendered":"https:\/\/devkico.itexto.com.br\/?p=739"},"modified":"2010-08-01T12:57:43","modified_gmt":"2010-08-01T15:57:43","slug":"como-uso-grails-a-questao-do-codigo-legado","status":"publish","type":"post","link":"https:\/\/devkico.itexto.com.br\/?p=739","title":{"rendered":"Como uso Grails &#8211; a quest\u00e3o do c\u00f3digo legado"},"content":{"rendered":"<p><a href=\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2010\/02\/grails_logo.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignleft size-full wp-image-604\" style=\"margin: 10px;\" title=\"grails_logo\" src=\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2010\/02\/grails_logo.png\" alt=\"\" width=\"163\" height=\"43\" \/><\/a>De todos os frameworks web que j\u00e1 usei (Java ou n\u00e3o) de longe Grails \u00e9 o meu favorito. \u00c9 a plataforma Java Enterprise Edition como sempre deveria ter sido: simples, direta, f\u00e1cil de usar e sem burocracia. Mas sabe de uma coisa? Adoro um Grails\u00a0<em><strong>&#8220;mutilado&#8221;<\/strong><\/em>!<\/p>\n<p>Eu sei: soa estranho, mas eu n\u00e3o uso todo o stack do Grails. Ignoro o GORM, que \u00e9 a camada de persist\u00eancia. E o scaffolding, raz\u00e3o pela qual muitos se apaixonam pelo framework eu simplesmente <a href=\"https:\/\/devkico.itexto.com.br\/?p=496\" target=\"_blank\">abomino<\/a>. E quer saber de mais uma coisa? S\u00f3 uso 2 plugins: jQuery e Quartz. Conforme fui me aprofundando no framework acabei desenvolvendo uma maneira pr\u00f3pria de trabalhar com ele. E \u00e9 justamente este o assunto deste post.<\/p>\n<h2>O que \u00e9 lindo no Grails: o fato de ser Java<\/h2>\n<p>O mais legal \u00e9 o fato de ser baseado em Groovy. A f\u00f3rmula \u00e9 simples: <strong>se \u00e9 Groovy, \u00e9 Java<\/strong>. Tudo aquilo que voc\u00ea est\u00e1 acostumado a fazer em Java pode ser feito quase que da mesma forma com Groovy. Na realidade: da pra fazer de formas ainda mais <a href=\"https:\/\/devkico.itexto.com.br\/?p=62\">legais<\/a>. O acesso ao c\u00f3digo legado (o que inclui todas as suas bibliotecas e frameworks favoritos) de forma transparente funciona como se fosse uma &#8220;fonte da juventude&#8221; para todo aquele amontoado de c\u00f3digo que muitas vezes adquire com o tempo uma certa aura de tediosidade. Como j\u00e1 disse antes, <a href=\"https:\/\/devkico.itexto.com.br\/?p=224\" target=\"_blank\">Grails tira a plataforma JEE do marasmo<\/a>.<\/p>\n<p>Lembre-se disto: <strong>Groovy \u00e9 Java<\/strong>. Ao trabalhar com Grails, voc\u00ea n\u00e3o precisa usar s\u00f3 os plugins oferecidos para o framework. Voc\u00ea pode e <strong>deve<\/strong> ir al\u00e9m. Se quiser pular o resto deste post, tenha apenas isto em mente.<\/p>\n<h2>MVC como lei: o problema com Grails<\/h2>\n<p>No meu caso \u00e9 muito comum precisar escrever uma aplica\u00e7\u00e3o que ser\u00e1 executada em diversos ambientes diferentes usando a mesma l\u00f3gica de neg\u00f3cio. At\u00e9 ai, tudo bem: eu poderia centralizar minha l\u00f3gica de neg\u00f3cios em um servidor de aplica\u00e7\u00f5es e em seguida simplesmente implementar uma s\u00e9rie de clientes, certo? Infelizmente apenas em condi\u00e7\u00f5es ideais de temperatura e press\u00e3o.<\/p>\n<p>Muitas vezes um cliente quer uma vers\u00e3o desktop de uma aplica\u00e7\u00e3o web que eu j\u00e1 tenha desenvolvido, ou mesmo o contr\u00e1rio. E em um n\u00famero assustadoramente grande de vezes eu sequer posso contar com um servidor de aplica\u00e7\u00f5es (ainda n\u00e3o estamos no para\u00edso). Nestes casos a \u00fanica constante computacional que possuo (quando dou sorte) \u00e9 o SGBD.\u00a0 No meu caso reaproveitamento se torna uma quest\u00e3o de <strong>sobreviv\u00eancia<\/strong>.<\/p>\n<p><a href=\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2010\/07\/Spring25.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignright size-full wp-image-742\" title=\"Spring25\" src=\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2010\/07\/Spring25.png\" alt=\"\" width=\"204\" height=\"97\" srcset=\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2010\/07\/Spring25.png 395w, https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2010\/07\/Spring25-300x142.png 300w\" sizes=\"(max-width: 204px) 100vw, 204px\" \/><\/a>A solu\u00e7\u00e3o que encontrei se chama <strong>Spring<\/strong>. Com ele tenho quase todos os recursos que obteria com EJB sem a necessidade de um servidor de aplica\u00e7\u00f5es e, o que \u00e9 ainda melhor: tornando meu c\u00f3digo Java realmente m\u00f3vel. Basta que eu o empacote tudo o que eu preciso em arquivos jar e em seguida os reaproveite no ambiente de execu\u00e7\u00e3o em quest\u00e3o: web, desktop ou seja l\u00e1 o que for.<\/p>\n<p>\u00c9 exatamente por esta raz\u00e3o &#8211; a necessidade de reaproveitamento de c\u00f3digo &#8211; que em 99% das vezes uso XML ao inv\u00e9s de anota\u00e7\u00f5es pra configurar o Spring ou o Hibernate. XML eu externalizo f\u00e1cil fora dos meus arquivos .jar: anota\u00e7\u00f5es n\u00e3o.<\/p>\n<h3>O problema do reaproveitamento de c\u00f3digo Grails<\/h3>\n<p>Grails me tr\u00e1s um \u00fanico inconveniente: se voc\u00ea desenvolve algo 100% baseado no framework, o reaproveitamento do c\u00f3digo gerado <strong>fora<\/strong> do Grails se mostra bem complicado. Resumindo: jogar seu c\u00f3digo Java dentro de um projeto Grails \u00e9 maravilhosamente simples: basta copiar todos os arquivos jar necess\u00e1rios para o diret\u00f3rio lib da sua aplica\u00e7\u00e3o. No entanto, se voc\u00ea escreve sua l\u00f3gica de neg\u00f3cio usando como base componentes de infraestrutura do Grails como o GORM, por exemplo, reaproveitar seu c\u00f3digo Groovy fora da plataforma Grails se mostra tarefa pr\u00e1ticamente imposs\u00edvel.<\/p>\n<p>O \u00fanico modo eficiente que conhe\u00e7o de reaproveitar c\u00f3digo 100% baseado em Grails \u00e9 atrav\u00e9s da cria\u00e7\u00e3o de plugins. Infelizmente seu plugin s\u00f3 poder\u00e1 ser executado em outro projeto Grails (pelo menos por enquanto). Apesar de desde a vers\u00e3o 1.2 (ou seria a 1.1?) dizerem ser poss\u00edvel usar o GORM fora do Grails, eu nunca o consegui nem conheci algu\u00e9m que tivesse obtido sucesso nesta tarefa (se voc\u00ea obteve, por favor, me conte como fez ok?).<\/p>\n<h3>Como resolvo a quest\u00e3o<\/h3>\n<p>Simplesmente n\u00e3o uso o GORM. Ao iniciar um novo projeto em Grails que v\u00e1 usar meu c\u00f3digo legado, a primeira coisa que fa\u00e7o \u00e9 desinstalar o plugin do Hibernate. Assim n\u00e3o tenho sequer a tenta\u00e7\u00e3o de criar uma ou outra classe de dom\u00ednio que seja persistida com o GORM. Na pr\u00e1tica, \u00a0a \u00fanica vantagem do GORM &#8211; ao menos pra mim &#8211; sempre foi a cria\u00e7\u00e3o de finders din\u00e2micos e o modo como as classes de dom\u00ednio s\u00e3o mapeadas para o banco de dados.<\/p>\n<p>Mas sabe de uma coisa? Percebi que raramente uso finders din\u00e2micos! Sendo assim, no meu caso vale muito \u00e0 pena sacrificar uma funcionalidade que eu rar\u00edssimas vezes uso por uma maior mobilidade do meu c\u00f3digo fonte.<\/p>\n<p>Toda a minha camada de neg\u00f3cio \u00e9 implementada <strong>fora<\/strong> do Grails. Normalmente \u00e9 escrita usando Java, Groovy ou, mais recentemente, Clojure. Sempre sem qualquer depend\u00eancia direta com qualquer componente de infra-estruura do Grails.<\/p>\n<p>Resumindo: <strong>o Grails deixa de ser um framework full stack no meu caso e passa a ser o respons\u00e1vel apenas pela camada de visualiza\u00e7\u00e3o e controle.<\/strong><\/p>\n<h3>Mas sem o GORM, o que Grails tem de bacana? Tudo!<\/h3>\n<p>Mesmo sem ser usado como um framework fullstack, Grails ainda se mostra o meu framework web favorito. GSP \u00e9 uma das tecnologias mais bacanas com as quais j\u00e1 trabalhei. Isto porqu\u00ea diversas das tarefas chatas de serem feitas na plataforma JEE se mostram ridiculamente simples em Grails. S\u00f3 para citar algumas: cria\u00e7\u00e3o de tags customizadas e implementa\u00e7\u00e3o de filtros.<\/p>\n<p>Al\u00e9m disto, o modo como criamos controladores com Grails \u00e9 o mais elegante que j\u00e1 encontrei. Muito mais f\u00e1cil de se trabalhar do que com JSF ou Struts por exemplo. \u00c9 direto, simples, sem burocracia. Eu posso me focar s\u00f3 no que o controlador tem de fazer e o que \u00e9 ainda mais interessante: dentro deste tratar meu c\u00f3digo Java como se fosse Groovy!<\/p>\n<h2>Scaffolding<\/h2>\n<p>Muita gente se apaixona pelo Grails ao ver o scaffolding em funcionamento. O problema \u00e9 que muitos acabam se esquecendo de um fato b\u00e1sico: scaffolding em ingl\u00eas significa andaime. O que \u00e9 um andaime? \u00c9 uma estrutura que usamos como <strong>apoio <\/strong>ao construir alguma coisa, n\u00e3o \u00e9 o objetivo buscado.<\/p>\n<p>Vejo muitos iniciantes acharem que s\u00f3 podem executar determinada tarefa em Grails se o scaffolding oferecer recurso para tal. Bom: sendo assim sua aplica\u00e7\u00e3o s\u00f3 poder\u00e1 incluir, editar, excluir e listar registros no banco de dados. Se este \u00e9 o objetivo do seu projeto, v\u00e1 fundo! O problema \u00e9 que sua aplica\u00e7\u00e3o corresponde a apenas 0,01% dos casos reais. Ainda bem, pois caso contr\u00e1rio desenvolver sistemas seria <a href=\"http:\/\/www.newtechusa.com\/PPI\/main.asp\" target=\"_blank\">tarefa executada por macacos<\/a>.<\/p>\n<p>Como n\u00e3o sou um macaco e o CRUD b\u00e1sico gerado pelo scaffolding do Grails no meu caso \u00e9 desnecess\u00e1rio &#8211; pois sempre estou reaproveitando meu c\u00f3digo legado &#8211; simplesmente o ignoro, mutilando assim mais um membro do Grails.<\/p>\n<h2>Plugins<\/h2>\n<p><a href=\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2010\/07\/plugins.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignright size-full wp-image-744\" title=\"plugins\" src=\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2010\/07\/plugins.png\" alt=\"\" width=\"237\" height=\"237\" srcset=\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2010\/07\/plugins.png 300w, https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2010\/07\/plugins-150x150.png 150w\" sizes=\"(max-width: 237px) 100vw, 237px\" \/><\/a>A id\u00e9ia do plugin \u00e9 maravilhosa. \u00c9 o reaproveitamento de c\u00f3digo no qual &#8220;<a href=\"http:\/\/www.youtube.com\/watch?v=z7k4-e5jwsY\" target=\"_blank\">nada pode dar errado<\/a>&#8220;, visto que, ao menos em teoria, trata-se de um projeto j\u00e1 bastante testado, com qualidade excelente e que lhe poupar\u00e1 um tempo enorme, pois te livra do trabalho de precisar reinventar a roda. Infelizmente nem tudo s\u00e3o flores.<\/p>\n<p>De todos os plugins n\u00e3o desenvolvidos por mim ou pela minha equipe, acabei ficando com apenas dois: jQuery e Quartz.\u00a0Antes de construir uma aplica\u00e7\u00e3o lotada de plugins, sempre levo em considera\u00e7\u00e3o o seguinte:<\/p>\n<p><strong>Aumento acidental do d\u00e9ficit t\u00e9cnico &#8211; <\/strong>Sejamos honestos: quantas vezes voc\u00ea chegou a ler (e <strong>entender<\/strong>) o c\u00f3digo fonte dos plugins que usa em seus projetos? Caso encontre um bug no seu plugin favorito e seu deadline esteja curto, voc\u00ea tem certeza de que conseguir\u00e1 <strong>em tempo h\u00e1bil<\/strong> resolver o bug deste componente ou encontrar uma solu\u00e7\u00e3o alternativa <strong>de qualidade<\/strong>?\u00a0 Minha solu\u00e7\u00e3o para este problema \u00e9 simples: se for para usar um plugin, s\u00f3 opto por ele se j\u00e1 tiver um bom hist\u00f3rico por tr\u00e1s, ou seja, ignoro qualquer plugin que ainda esteja na sua primeira revis\u00e3o e que tenha sido pouco usado pela comunidade.<\/p>\n<p><strong>Problemas de compatibildiade<\/strong> &#8211; Quem trabalha com Grails tem de estar preparado paraa atualizar o framework sempre que seja lan\u00e7ado um novo release. Convenhamos: apesar de ser um framework maravilhoso, ainda possui <a href=\"http:\/\/jira.codehaus.org\/browse\/GRAILS#selectedTab=com.atlassian.jira.plugin.system.project%3Aissues-panel\" target=\"_blank\">um BOM n\u00famero de bugs<\/a>. <strong>\u00c9<\/strong> <strong>vital<\/strong> que seu projeto esteja com a \u00faltima vers\u00e3o do Grails. Agora: e se o seu plugin for incompat\u00edvel com o \u00faltimo release o que voc\u00ea faz? Chora? Espera que o autor do plugin encontre uma solu\u00e7\u00e3o para o problema?<\/p>\n<p><strong>Aumento do n\u00famero de depend\u00eancias &#8211;<\/strong> \u00c9 fato. Seu projeto agora depende de c\u00f3digo que s\u00f3 estar\u00e1 sob seu dom\u00ednio se, e somente se, voc\u00ea tiver conhecimento completo sobre seu funcionamento. Ao optar pelo uso de um plugin, tenha sempre em m\u00e3os o c\u00f3digo fonte usado e, ainda mais importante: compreenda-o.<\/p>\n<p>Resumindo:<strong> plugins s\u00e3o uma das boas coisas da vida. Sendo assim voc\u00ea precisa trat\u00e1-lo como tal, ou seja, com <span style=\"color: #ff0000;\">EXTREMA<\/span> modera\u00e7\u00e3o<\/strong>. N\u00e3o estou sozinho na minha opini\u00e3o sobre plugins. DHH tem uma vis\u00e3o <a href=\"http:\/\/blog.plataformatec.com.br\/2010\/01\/how-everyone-is-inserting-technical-debt-in-app\/\" target=\"_blank\">bastante similar<\/a>.<\/p>\n<p>(e antes que digam: n\u00e3o estou dizendo que os \u00fanicos plugins bons s\u00e3o o jQuery e o Quartz)<\/p>\n<h2>Concluindo<\/h2>\n<p>Grails \u00e9 maravilhoso. Este framework revitalizou meu c\u00f3digo legado de uma forma que at\u00e9 ent\u00e3o eu n\u00e3o podia sequer sonhar. Quando Ruby on Rails surgiu e se tornou popular, ficou claro que o modo como estavamos desenvolvendo aplica\u00e7\u00f5es para a plataforma JEE tinha algo de <strong>muito errado<\/strong>. O problema \u00e9 que muitos desenvolvedores &#8211; como eu &#8211; j\u00e1 tinham uma quantidade significativa de c\u00f3digo legado de qualidade, ou seja, testado e funcionando perfeitamente (ou quase :) ) e n\u00e3o podiam se dar ao luxo de ter o retrabalho de \u00a0implementar novamente em outra linguagem. <strong>Legado s\u00f3 \u00e9 negativo quando \u00e9 de m\u00e1 qualidade e voc\u00ea \u00e9 obrigado a conviver com ele<\/strong>.<\/p>\n<p>Quando conheci Grails foi um al\u00edvio imenso porque de repente eu podia escrever aplica\u00e7\u00f5es como em Ruby on Rails dentro da plataforma Java sem precisar reescrever nada do que j\u00e1 estava pronto. E o que era melhor: de uma forma <strong>muito<\/strong> produtiva, porque at\u00e9 a minha curva de aprendizado era menor. Afinal de contas, eu ainda podia contar com as mesmas bibliotecas com as quais adorava trabalhar, como por exemplo as do projeto Apache Commons.<\/p>\n<p>Meu conselho para quem estiver inicando em Grails \u00e9 o seguinte: se for um projeto novo, criado a partir do zero e que s\u00f3 ser\u00e1 executado em um ambiente computacional, no caso, web: use e abuse dos recursos oferecidos pelo framework. Se puder sempre contar com um servidor de aplica\u00e7\u00f5es para este projeto e seus derivados n\u00e3o se assuste com os problemas de mobilidade de c\u00f3digo que mencionei acima: voc\u00ea pode implementar interfaces REST ou baseadas em WS com Grails de uma maneira maravilhosamente simples.<\/p>\n<p>Agora: se voc\u00ea possui c\u00f3digo legado <strong>de qualidade<\/strong>, ou sabe que alguns componentes do seu projeto dever\u00e3o ser executados em ambientes diversos, implemente-os de forma completamente independente do Grails.<\/p>\n<p>De uma forma ou de outra voc\u00ea sair\u00e1 ganhando porque a produtividade do Grails &#8211; mesmo mutilado &#8211; \u00e9 simplesmente fant\u00e1stica. O mais importante a ser lembrado \u00e9 o seguinte: voc\u00ea n\u00e3o programa em Grails, mas sim em alguma linguagem de programa\u00e7\u00e3o executada na JVM. Sua plataforma n\u00e3o \u00e9 &#8211; nem deve ser &#8211; o framework, mas a JVM. Tire proveito disto!<\/p>\n<h2>Leitura complementar<\/h2>\n<p>Joel Spolsky tem um artigo chamado &#8220;Things You Should Never Do &#8211; Part I&#8221; que \u00e9 justamente sobre o perigo de se reescrever c\u00f3digo do zero, e como isto pode destruir a sua empresa. Concordo com o autor, cujo texto pode ser lido aqui: <a href=\"http:\/\/www.joelonsoftware.com\/articles\/fog0000000069.html\" target=\"_blank\">http:\/\/www.joelonsoftware.com\/articles\/fog0000000069.html<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>De todos os frameworks web que j\u00e1 usei (Java ou n\u00e3o) de longe Grails \u00e9 o meu favorito. \u00c9 a plataforma Java Enterprise Edition como sempre deveria ter sido: simples, direta, f\u00e1cil de usar e sem burocracia. Mas sabe de uma coisa? Adoro um Grails\u00a0&#8220;mutilado&#8221;! Eu sei: soa estranho, mas eu n\u00e3o uso todo o [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_coblocks_attr":"","_coblocks_dimensions":"","_coblocks_responsive_height":"","_coblocks_accordion_ie_support":"","site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-gradient":""}},"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[3],"tags":[],"class_list":["post-739","post","type-post","status-publish","format-standard","hentry","category-grails"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v22.8 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Como uso Grails - a quest\u00e3o do c\u00f3digo legado - \/dev\/Kico<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/devkico.itexto.com.br\/?p=739\" \/>\n<meta property=\"og:locale\" content=\"pt_BR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Como uso Grails - a quest\u00e3o do c\u00f3digo legado - \/dev\/Kico\" \/>\n<meta property=\"og:description\" content=\"De todos os frameworks web que j\u00e1 usei (Java ou n\u00e3o) de longe Grails \u00e9 o meu favorito. \u00c9 a plataforma Java Enterprise Edition como sempre deveria ter sido: simples, direta, f\u00e1cil de usar e sem burocracia. Mas sabe de uma coisa? Adoro um Grails\u00a0&#8220;mutilado&#8221;! Eu sei: soa estranho, mas eu n\u00e3o uso todo o [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/devkico.itexto.com.br\/?p=739\" \/>\n<meta property=\"og:site_name\" content=\"\/dev\/Kico\" \/>\n<meta property=\"article:published_time\" content=\"2010-08-01T15:57:43+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/www.itexto.net\/devkico\/wp-content\/uploads\/2010\/02\/grails_logo.png\" \/>\n<meta name=\"author\" content=\"Kico (Henrique Lobo Weissmann)\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@loboweissmann\" \/>\n<meta name=\"twitter:label1\" content=\"Escrito por\" \/>\n\t<meta name=\"twitter:data1\" content=\"Kico (Henrique Lobo Weissmann)\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. tempo de leitura\" \/>\n\t<meta name=\"twitter:data2\" content=\"10 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/devkico.itexto.com.br\/?p=739\",\"url\":\"https:\/\/devkico.itexto.com.br\/?p=739\",\"name\":\"Como uso Grails - a quest\u00e3o do c\u00f3digo legado - \/dev\/Kico\",\"isPartOf\":{\"@id\":\"https:\/\/devkico.itexto.com.br\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/devkico.itexto.com.br\/?p=739#primaryimage\"},\"image\":{\"@id\":\"https:\/\/devkico.itexto.com.br\/?p=739#primaryimage\"},\"thumbnailUrl\":\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2010\/02\/grails_logo.png\",\"datePublished\":\"2010-08-01T15:57:43+00:00\",\"dateModified\":\"2010-08-01T15:57:43+00:00\",\"author\":{\"@id\":\"https:\/\/devkico.itexto.com.br\/#\/schema\/person\/502ab8892631bb005d6da2269fe5a3a7\"},\"breadcrumb\":{\"@id\":\"https:\/\/devkico.itexto.com.br\/?p=739#breadcrumb\"},\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/devkico.itexto.com.br\/?p=739\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/devkico.itexto.com.br\/?p=739#primaryimage\",\"url\":\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2010\/02\/grails_logo.png\",\"contentUrl\":\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2010\/02\/grails_logo.png\",\"width\":\"163\",\"height\":\"43\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/devkico.itexto.com.br\/?p=739#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/devkico.itexto.com.br\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Como uso Grails &#8211; a quest\u00e3o do c\u00f3digo legado\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/devkico.itexto.com.br\/#website\",\"url\":\"https:\/\/devkico.itexto.com.br\/\",\"name\":\"\/dev\/Kico\",\"description\":\"Desenvolvendo software\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/devkico.itexto.com.br\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"pt-BR\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/devkico.itexto.com.br\/#\/schema\/person\/502ab8892631bb005d6da2269fe5a3a7\",\"name\":\"Kico (Henrique Lobo Weissmann)\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/devkico.itexto.com.br\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/dd6973d86a689bc63122b2e603f25be3?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/dd6973d86a689bc63122b2e603f25be3?s=96&d=mm&r=g\",\"caption\":\"Kico (Henrique Lobo Weissmann)\"},\"sameAs\":[\"https:\/\/x.com\/loboweissmann\"],\"url\":\"https:\/\/devkico.itexto.com.br\/?author=1\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Como uso Grails - a quest\u00e3o do c\u00f3digo legado - \/dev\/Kico","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/devkico.itexto.com.br\/?p=739","og_locale":"pt_BR","og_type":"article","og_title":"Como uso Grails - a quest\u00e3o do c\u00f3digo legado - \/dev\/Kico","og_description":"De todos os frameworks web que j\u00e1 usei (Java ou n\u00e3o) de longe Grails \u00e9 o meu favorito. \u00c9 a plataforma Java Enterprise Edition como sempre deveria ter sido: simples, direta, f\u00e1cil de usar e sem burocracia. Mas sabe de uma coisa? Adoro um Grails\u00a0&#8220;mutilado&#8221;! Eu sei: soa estranho, mas eu n\u00e3o uso todo o [&hellip;]","og_url":"https:\/\/devkico.itexto.com.br\/?p=739","og_site_name":"\/dev\/Kico","article_published_time":"2010-08-01T15:57:43+00:00","og_image":[{"url":"http:\/\/www.itexto.net\/devkico\/wp-content\/uploads\/2010\/02\/grails_logo.png"}],"author":"Kico (Henrique Lobo Weissmann)","twitter_card":"summary_large_image","twitter_creator":"@loboweissmann","twitter_misc":{"Escrito por":"Kico (Henrique Lobo Weissmann)","Est. tempo de leitura":"10 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/devkico.itexto.com.br\/?p=739","url":"https:\/\/devkico.itexto.com.br\/?p=739","name":"Como uso Grails - a quest\u00e3o do c\u00f3digo legado - \/dev\/Kico","isPartOf":{"@id":"https:\/\/devkico.itexto.com.br\/#website"},"primaryImageOfPage":{"@id":"https:\/\/devkico.itexto.com.br\/?p=739#primaryimage"},"image":{"@id":"https:\/\/devkico.itexto.com.br\/?p=739#primaryimage"},"thumbnailUrl":"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2010\/02\/grails_logo.png","datePublished":"2010-08-01T15:57:43+00:00","dateModified":"2010-08-01T15:57:43+00:00","author":{"@id":"https:\/\/devkico.itexto.com.br\/#\/schema\/person\/502ab8892631bb005d6da2269fe5a3a7"},"breadcrumb":{"@id":"https:\/\/devkico.itexto.com.br\/?p=739#breadcrumb"},"inLanguage":"pt-BR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/devkico.itexto.com.br\/?p=739"]}]},{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/devkico.itexto.com.br\/?p=739#primaryimage","url":"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2010\/02\/grails_logo.png","contentUrl":"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2010\/02\/grails_logo.png","width":"163","height":"43"},{"@type":"BreadcrumbList","@id":"https:\/\/devkico.itexto.com.br\/?p=739#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/devkico.itexto.com.br\/"},{"@type":"ListItem","position":2,"name":"Como uso Grails &#8211; a quest\u00e3o do c\u00f3digo legado"}]},{"@type":"WebSite","@id":"https:\/\/devkico.itexto.com.br\/#website","url":"https:\/\/devkico.itexto.com.br\/","name":"\/dev\/Kico","description":"Desenvolvendo software","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/devkico.itexto.com.br\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"pt-BR"},{"@type":"Person","@id":"https:\/\/devkico.itexto.com.br\/#\/schema\/person\/502ab8892631bb005d6da2269fe5a3a7","name":"Kico (Henrique Lobo Weissmann)","image":{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/devkico.itexto.com.br\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/dd6973d86a689bc63122b2e603f25be3?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/dd6973d86a689bc63122b2e603f25be3?s=96&d=mm&r=g","caption":"Kico (Henrique Lobo Weissmann)"},"sameAs":["https:\/\/x.com\/loboweissmann"],"url":"https:\/\/devkico.itexto.com.br\/?author=1"}]}},"jetpack_featured_media_url":"","jetpack-related-posts":[],"jetpack_sharing_enabled":true,"jetpack_likes_enabled":true,"_links":{"self":[{"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=\/wp\/v2\/posts\/739"}],"collection":[{"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=739"}],"version-history":[{"count":9,"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=\/wp\/v2\/posts\/739\/revisions"}],"predecessor-version":[{"id":751,"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=\/wp\/v2\/posts\/739\/revisions\/751"}],"wp:attachment":[{"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=739"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=739"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=739"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}