27 jun 2014 Van Grails 2.3 naar 2.4 – Deel 2 Nieuws Deel 2: Lees meer over Grails 2.4 en de wijzigingen sinds oktober 2013 in dit artikel. 6. Hibernate / Tomcat De Hibernate en Tomcat plugin zijn nu losgetrokken van de Grails versie die je op dit moment gebruikt. Dus niet meer in je BuildConfig iets van runtime “:tomcat:$grailsVersion” maar gewoon een versienummer van de Tomcat plugin zoals dit: compile(”:tomcat:$grailsVersion”, ¬”:hibernate:$grailsVersion”) ¬{ ¬ ¬ ¬ ¬ ¬ ¬ ¬ ¬ ¬ ¬ ¬ ¬export ¬= ¬false } 7. XSS protectie Standaard worden alle views/pagina’s binnen Grails nu HTML-encoded. Hier hoef je niets voor te doen want standaard staat nu dit in de Config.groovy grails.views.default.codec ¬= ¬”html” 8. Dependency management Dependency management wordt nu geregeld via Aether [https://eclipse.org/aether/]. Aether is de nieuwe defacto standaard voor dependency resolution. Als je hiervan gebruik wilt maken, dan kun je de standaard setting van een nieuwe Grails applicatie aanhouden omdat dit in je Config.groovy staat: grails.project.dependency.resolver ¬= ¬”maven” ¬// ¬or ¬ivy Als je wilt overschakelen vanwege issues of als je gebruik wilt maken van je locale dependencies dan moet je (tijdelijk) overschakelen naar de ivy instelling. Let op: de allereerste keer moet je online zijn om je nieuwe dependencies op te halen. 9. Dependency injection voor integratie testen De unittesten hoeven niet langer meer te erven van GroovyTestCase maar je moet nu je testen annoteren met @TestMixin(IntegrationTestMixin). 10. Asynchrone ondersteuning Voor de diehards onder ons die graag willen werken met concurrent programming is Grails nu uitgerust met de Promise API. Uiteraard weer ingepakt in een Grails verpakking zodat we alleen de voordelen ervan hebben … Hieronder een code voorbeeld: This code returns a Promise object. import ¬static ¬grails.async.Promises.* … def ¬index() ¬{ ¬ ¬ ¬tasks ¬books: ¬Book.async.list(), ¬ ¬ ¬ ¬ ¬ ¬ ¬ ¬ ¬totalBooks: ¬Book.async.count(), ¬ ¬ ¬ ¬ ¬ ¬ ¬ ¬ ¬otherValue: ¬{ ¬ ¬ ¬ ¬ ¬ ¬ ¬ ¬ ¬ ¬ ¬// ¬do ¬hard ¬work ¬ ¬ ¬ ¬ ¬ ¬ ¬ ¬ ¬} } 11. Async – More code def ¬p1 ¬= ¬task ¬{ ¬2 ¬* ¬2 ¬} def ¬p2 ¬= ¬task ¬{ ¬4 ¬* ¬4 ¬} def ¬p3 ¬= ¬task ¬{ ¬8 ¬* ¬8 ¬} assert ¬[4,16,64] ¬== ¬waitAll(p1, ¬p2, ¬p3) Voor nadere informatie omtrent de migratie naar Grails 2.3.x verwijs ik naar http://grails.org/doc/2.3.1/guide/upgradingFromPreviousVersionsOfGrails.html 12. Wijzigingen versie 2.4 Hieronder een overzicht van de meest in het oog springende wijzigingen in Grails 2.4.0. 12.1. Upgrade command is verwijderd Upgrade wordt nu uitgevoerd via: $ ¬grails ¬set-grails-version ¬2.4.0 ¬ ¬(zet ¬de ¬grails.version ¬op ¬2.4.0 ¬in ¬application.properties) Daarnaast moeten de volgende dependencies goed worden gezet. Zet de Grails dependencies zoveel mogelijk gelijk aan de 2.3.0 branch. Zie de code hieronder: plugins ¬{ ¬ ¬ ¬ ¬ ¬ ¬ ¬ ¬// ¬plugins ¬for ¬the ¬build ¬system ¬only ¬ ¬ ¬ ¬ ¬ ¬ ¬ ¬build ¬’:tomcat:7.0.52.1’ ¬ ¬ ¬ ¬ ¬ ¬ ¬ ¬// ¬plugins ¬for ¬the ¬compile ¬step ¬ ¬ ¬ ¬ ¬ ¬ ¬ ¬compile ¬’:scaffolding:2.1.0’ ¬ ¬ ¬ ¬ ¬ ¬ ¬ ¬compile ¬’:cache:1.1.3’ ¬ ¬ ¬ ¬ ¬ ¬ ¬ ¬compile ¬’:asset-pipeline:1.8.3’ ¬ ¬ ¬ ¬ ¬ ¬ ¬ ¬// ¬plugins ¬needed ¬at ¬runtime ¬but ¬not ¬for ¬compilation ¬ ¬ ¬ ¬ ¬ ¬ ¬ ¬runtime ¬’:hibernate4:4.3.5.2’ ¬// ¬or ¬’:hibernate:3.6.10.14’ ¬ ¬ ¬ ¬ ¬ ¬ ¬ ¬runtime ¬’:database-migration:1.4.0’ ¬ ¬ ¬ ¬ ¬ ¬ ¬ ¬runtime ¬’:jquery:1.11.0.2’ ¬ ¬ ¬ ¬ ¬ ¬ ¬ ¬… ¬ ¬ ¬ ¬} 13. Nieuw Command Object gedrag Het data binding gedrag voor Command object is veranderd (lees: uitgebreid) in Grails 2.4. Request parameter names mogen nu voorafgegaan worden met de naam van de controller-action argument name zodat Grails de properties kan binden aan dit command object. Voorbeeld: we hebben een buy actie in de controller hieronder. De request parameter buyer.name zal gekoppeld worden aan het buyer object van het type Person. Een parameter name seller.name zal daarentegen worden gekoppeld aan het domeinobject seller van het type Person. Zie hieronder voor de bijbehorende code: class ¬StoreController ¬{ ¬ ¬ ¬ ¬def ¬buy(Person ¬buyer, ¬Person ¬seller) ¬{ ¬ ¬ ¬ ¬ ¬ ¬ ¬ ¬// ¬… ¬ ¬ ¬ ¬} } class ¬Person ¬{ ¬ ¬ ¬ ¬String ¬name } 14. Allowed methods wordt nu door Unittesten gebruikt Tot versie 2.4 negeerden unittesten altijd de allowedMethods property in controllers. Vanaf Grails 2.4 wordt de allowedMethods property ook door unittesten herkend en gerespecteerd. Voorbeeld: // ¬grails-app/controllers/com/demo/DemoController.groovypackage ¬com.demo class ¬DemoController ¬{ ¬ ¬ ¬ ¬static ¬allowedMethods ¬= ¬[save: ¬’POST’, ¬update: ¬’PUT’, ¬delete: ¬’DELETE’] ¬ ¬ ¬ ¬def ¬save() ¬{ ¬ ¬ ¬ ¬ ¬ ¬ ¬ ¬render ¬’Save ¬was ¬successful!’ ¬ ¬ ¬ ¬} ¬ ¬ ¬ ¬// ¬… } // ¬test/unit/com/demo/DemoControllerSpec.groovy package ¬com.demo import ¬grails.test.mixin.TestFor import ¬spock.lang.Specification import ¬static ¬javax.servlet.http.HttpServletResponse.* @TestFor(DemoController) class ¬DemoControllerSpec ¬extends ¬Specification ¬{ ¬ ¬ ¬ ¬void ¬”test ¬a ¬valid ¬request ¬method”() ¬{ ¬ ¬ ¬ ¬ ¬ ¬ ¬ ¬when: ¬ ¬ ¬ ¬ ¬ ¬ ¬ ¬request.method ¬= ¬’POST’ ¬ ¬ ¬ ¬ ¬ ¬ ¬ ¬controller.save() ¬ ¬ ¬ ¬ ¬ ¬ ¬ ¬then: ¬ ¬ ¬ ¬ ¬ ¬ ¬ ¬response.status ¬== ¬SC_OK ¬ ¬ ¬ ¬ ¬ ¬ ¬ ¬response.text ¬== ¬’Save ¬was ¬successful!’ ¬ ¬ ¬ ¬} ¬ ¬ ¬ ¬void ¬”test ¬an ¬invalid ¬request ¬method”() ¬{ ¬ ¬ ¬ ¬ ¬ ¬ ¬ ¬when: ¬ ¬ ¬ ¬ ¬ ¬ ¬ ¬request.method ¬== ¬’DELETE’ ¬ ¬ ¬ ¬ ¬ ¬ ¬ ¬controller.save() ¬ ¬ ¬ ¬ ¬ ¬ ¬ ¬then: ¬ ¬ ¬ ¬ ¬ ¬ ¬ ¬response.status ¬== ¬SC_METHOD_NOT_ALLOWED ¬ ¬ ¬ ¬} } 15. Asset pipeline plugin Vanaf Grails 2.4 wordt de resource plugin deprecated en vervangen door de asset-pipeline plugin. In Grails 2.3 kon je hier al gebruik van maken door het volgende in je code te uit-commentariëren: ¬ ¬ ¬ ¬ ¬ ¬ ¬ ¬// ¬An ¬alternative ¬to ¬the ¬default ¬resources ¬plugin ¬is ¬the ¬asset-pipeline ¬plugin ¬ ¬ ¬ ¬ ¬ ¬ ¬ ¬//compile ¬”:asset-pipeline:1.6.1” ¬ ¬ ¬ ¬ ¬ ¬ ¬ ¬// ¬Uncomment ¬these ¬to ¬enable ¬additional ¬asset-pipeline ¬capabilities ¬ ¬ ¬ ¬ ¬ ¬ ¬ ¬//compile ¬”:sass-asset-pipeline:1.5.5” ¬ ¬ ¬ ¬ ¬ ¬ ¬ ¬//compile ¬”:less-asset-pipeline:1.5.3” ¬ ¬ ¬ ¬ ¬ ¬ ¬ ¬//compile ¬”:coffee-asset-pipeline:1.5.0” ¬ ¬ ¬ ¬ ¬ ¬ ¬ ¬//compile ¬”:handlebars-asset-pipeline:1.3.0.1” Mocht je toch gebruik willen blijven maken van de resource plugin via het voorbeeld hieronder bedenk dan dat je dan de laatste versie van de plugin gebruikt. Op moment van schrijven is dat versie 1.2.7. Voor nadere hot- en update info verwijs ik naar de static resource abstraction sectie van de Grails User Guide. { grailstouserguideresources} ¬runtime ¬”:resources:1.2.7” 16. Referenties http://grails.org/doc/2.4.0/guide/single.html https://acc.vijfhart.nl/blog/java/grails-search http://grails.org/doc/latest Cursus Grails Programming volgen? Klik hier voor meer informatie! Gerelateerde artikelen Vijfhart: kennispartner in de Digitale Transformatie Java voor testers (met Startgarantie) Help je loopbaan vooruit als MCSA Windows Server 2016