Van Grails 2.3 naar 2.4 – Deel 2

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 aGrails 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://www.vijfhart.nl/blog/java/grails-search
http://grails.org/doc/latest

 Cursus Grails Programming volgen? Klik hier voor meer informatie!

 

Onderwerpen
Actieve filters: Wis alle filters
Pageloader
PRIVACY VOORWAARDEN

Jouw persoonsgegevens worden opgenomen in onze beschermde database en worden niet aan derden verstrekt. Je stemt hiermee in dat wij jou van onze aanbiedingen op de hoogte houden. In al onze correspondentie zit een afmeldmogelijkheid