{"id":807,"date":"2010-10-07T08:27:48","date_gmt":"2010-10-07T11:27:48","guid":{"rendered":"https:\/\/devkico.itexto.com.br\/?p=807"},"modified":"2010-10-07T08:27:48","modified_gmt":"2010-10-07T11:27:48","slug":"grails-usando-invocacao-dinamica-de-metodos","status":"publish","type":"post","link":"https:\/\/devkico.itexto.com.br\/?p=807","title":{"rendered":"Grails: usando invoca\u00e7\u00e3o din\u00e2mica de m\u00e9todos"},"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>Ent\u00e3o voc\u00ea sabe que Groovy possui invoca\u00e7\u00e3o din\u00e2mica de m\u00e9todos (j\u00e1 falei sobre isto <a href=\"https:\/\/devkico.itexto.com.br\/?p=535\" target=\"_blank\">aqui<\/a>) mas n\u00e3o faz a menor id\u00e9ia de como tirar proveito deste recurso, certo? Aqui vai um exemplo.<\/p>\n<p>Imagine a seguinte situa\u00e7\u00e3o: voc\u00ea possui um controlador respons\u00e1vel por gerar relat\u00f3rios baseados em um per\u00edodo \u00a0que ser\u00e1 digitado pelo usu\u00e1rio em uma caixa de texto presente em uma p\u00e1gina. Nesta ser\u00e1 exposta uma caixa de sele\u00e7\u00e3o aonde dever\u00e1 ser selecionado qual o tipo de relat\u00f3rio a ser exposto e uma caixa de texto aonde digitaremos o per\u00edodo, tal como no c\u00f3digo abaixo:<\/p>\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">\r\n\r\n&lt;g:form action=&quot;relatorio&quot; controller=&quot;controladorQuente&quot;&gt;\r\n\r\nRelat\u00f3rio: &lt;select name=&quot;tipo_relatorio&quot;&gt;&lt;option value=&quot;vendas&quot;&gt;Vendas&lt;\/option&gt;&lt;option value=&quot;compras&quot;&gt;Compras&lt;\/option&gt;&lt;\/select&gt;\r\n\r\nPer\u00edodo: &lt;input type=&quot;text&quot; name=&quot;periodo&quot;\/&gt;\r\n\r\n&lt;input type=&quot;submit&quot; value=&quot;Gerar relat\u00f3rio&quot;\/&gt;\r\n\r\n&lt;\/g:form&gt;\r\n\r\n<\/pre>\n<p>Agora, vamos dar uma olhada no corpo do controlador relacionado:<\/p>\n<pre class=\"brush: plain; title: ; notranslate\" title=\"\">\r\n\r\ndef relatorio_vendas = {periodo -&gt;\r\n\/\/ faz o que tem de fazer\r\nrender(template:&quot;\/relatorio\/vendas&quot;, model:&#x5B;seus dados])\r\n}\r\n\r\ndef relatorio_compras = {periodo -&gt;\r\n\r\n\/\/ faz tamb\u00e9m o que deve fazer\r\n\r\nrender(template:&quot;\/relatorio\/compras&quot;, model:&#x5B;seus dados])\r\n\r\n}\r\n\r\ndef \u00a0relatorio = {\r\n\r\ndef periodo = params.periodo\r\n\r\ntry {\r\n\r\n\/\/ executo a closure a minha escolha com base no nome\r\n\r\n&quot;relatorio_${params.tipo_relatorio}&quot;(periodo)\r\n\r\n} catch (MissingMethodException ex) {\r\n\r\nrender(&quot;Ei! Este relat\u00f3rio n\u00e3o existe!&quot;)\r\n\r\n}\r\n\r\n}\r\n\r\n<\/pre>\n<p>Observe a action relatorio. Nela tiro proveito da invoca\u00e7\u00e3o din\u00e2mica de m\u00e9todos gerando uma nova string que representar\u00e1 o nome de uma closure interna presente no meu controlador. Estas closures tem acesso aos demais m\u00e9todos do controlador. Sendo assim, funcionam quase que como uma action convencional.<\/p>\n<p>Repare tamb\u00e9m que trato excess\u00f5es do tipo MissingMethodException, que \u00e9 disparada quando tentamos executar um m\u00e9todo que n\u00e3o existe dentro de nossas classes Groovy. Claro, este \u00e9 um c\u00f3digo hiper simples, e serve s\u00f3 pra que voc\u00ea veja como tirar proveito deste recurso que a linguagem Groovy nos fornece.<\/p>\n<p>Agora voc\u00ea sabe pelo menos um uso da invoca\u00e7\u00e3o din\u00e2mica de m\u00e9todos. :)<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Ent\u00e3o voc\u00ea sabe que Groovy possui invoca\u00e7\u00e3o din\u00e2mica de m\u00e9todos (j\u00e1 falei sobre isto aqui) mas n\u00e3o faz a menor id\u00e9ia de como tirar proveito deste recurso, certo? Aqui vai um exemplo. Imagine a seguinte situa\u00e7\u00e3o: voc\u00ea possui um controlador respons\u00e1vel por gerar relat\u00f3rios baseados em um per\u00edodo \u00a0que ser\u00e1 digitado pelo usu\u00e1rio em uma [&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,30,5],"tags":[],"class_list":["post-807","post","type-post","status-publish","format-standard","hentry","category-grails","category-grails-guia-rapido-e-indireto","category-groovy"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v22.8 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Grails: usando invoca\u00e7\u00e3o din\u00e2mica de m\u00e9todos - \/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=807\" \/>\n<meta property=\"og:locale\" content=\"pt_BR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Grails: usando invoca\u00e7\u00e3o din\u00e2mica de m\u00e9todos - \/dev\/Kico\" \/>\n<meta property=\"og:description\" content=\"Ent\u00e3o voc\u00ea sabe que Groovy possui invoca\u00e7\u00e3o din\u00e2mica de m\u00e9todos (j\u00e1 falei sobre isto aqui) mas n\u00e3o faz a menor id\u00e9ia de como tirar proveito deste recurso, certo? Aqui vai um exemplo. Imagine a seguinte situa\u00e7\u00e3o: voc\u00ea possui um controlador respons\u00e1vel por gerar relat\u00f3rios baseados em um per\u00edodo \u00a0que ser\u00e1 digitado pelo usu\u00e1rio em uma [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/devkico.itexto.com.br\/?p=807\" \/>\n<meta property=\"og:site_name\" content=\"\/dev\/Kico\" \/>\n<meta property=\"article:published_time\" content=\"2010-10-07T11:27:48+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=\"2 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=807\",\"url\":\"https:\/\/devkico.itexto.com.br\/?p=807\",\"name\":\"Grails: usando invoca\u00e7\u00e3o din\u00e2mica de m\u00e9todos - \/dev\/Kico\",\"isPartOf\":{\"@id\":\"https:\/\/devkico.itexto.com.br\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/devkico.itexto.com.br\/?p=807#primaryimage\"},\"image\":{\"@id\":\"https:\/\/devkico.itexto.com.br\/?p=807#primaryimage\"},\"thumbnailUrl\":\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2010\/02\/grails_logo.png\",\"datePublished\":\"2010-10-07T11:27:48+00:00\",\"dateModified\":\"2010-10-07T11:27:48+00:00\",\"author\":{\"@id\":\"https:\/\/devkico.itexto.com.br\/#\/schema\/person\/502ab8892631bb005d6da2269fe5a3a7\"},\"breadcrumb\":{\"@id\":\"https:\/\/devkico.itexto.com.br\/?p=807#breadcrumb\"},\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/devkico.itexto.com.br\/?p=807\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/devkico.itexto.com.br\/?p=807#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=807#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/devkico.itexto.com.br\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Grails: usando invoca\u00e7\u00e3o din\u00e2mica de m\u00e9todos\"}]},{\"@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":"Grails: usando invoca\u00e7\u00e3o din\u00e2mica de m\u00e9todos - \/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=807","og_locale":"pt_BR","og_type":"article","og_title":"Grails: usando invoca\u00e7\u00e3o din\u00e2mica de m\u00e9todos - \/dev\/Kico","og_description":"Ent\u00e3o voc\u00ea sabe que Groovy possui invoca\u00e7\u00e3o din\u00e2mica de m\u00e9todos (j\u00e1 falei sobre isto aqui) mas n\u00e3o faz a menor id\u00e9ia de como tirar proveito deste recurso, certo? Aqui vai um exemplo. Imagine a seguinte situa\u00e7\u00e3o: voc\u00ea possui um controlador respons\u00e1vel por gerar relat\u00f3rios baseados em um per\u00edodo \u00a0que ser\u00e1 digitado pelo usu\u00e1rio em uma [&hellip;]","og_url":"https:\/\/devkico.itexto.com.br\/?p=807","og_site_name":"\/dev\/Kico","article_published_time":"2010-10-07T11:27:48+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":"2 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/devkico.itexto.com.br\/?p=807","url":"https:\/\/devkico.itexto.com.br\/?p=807","name":"Grails: usando invoca\u00e7\u00e3o din\u00e2mica de m\u00e9todos - \/dev\/Kico","isPartOf":{"@id":"https:\/\/devkico.itexto.com.br\/#website"},"primaryImageOfPage":{"@id":"https:\/\/devkico.itexto.com.br\/?p=807#primaryimage"},"image":{"@id":"https:\/\/devkico.itexto.com.br\/?p=807#primaryimage"},"thumbnailUrl":"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2010\/02\/grails_logo.png","datePublished":"2010-10-07T11:27:48+00:00","dateModified":"2010-10-07T11:27:48+00:00","author":{"@id":"https:\/\/devkico.itexto.com.br\/#\/schema\/person\/502ab8892631bb005d6da2269fe5a3a7"},"breadcrumb":{"@id":"https:\/\/devkico.itexto.com.br\/?p=807#breadcrumb"},"inLanguage":"pt-BR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/devkico.itexto.com.br\/?p=807"]}]},{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/devkico.itexto.com.br\/?p=807#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=807#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/devkico.itexto.com.br\/"},{"@type":"ListItem","position":2,"name":"Grails: usando invoca\u00e7\u00e3o din\u00e2mica de m\u00e9todos"}]},{"@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\/807"}],"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=807"}],"version-history":[{"count":1,"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=\/wp\/v2\/posts\/807\/revisions"}],"predecessor-version":[{"id":808,"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=\/wp\/v2\/posts\/807\/revisions\/808"}],"wp:attachment":[{"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=807"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=807"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=807"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}