Articles

Poker addon explained: strategy lessons for smarter slot play
A poker add-on is an optional tournament purchase that gives a player extra chips after a rebuy period or at a defined stage of play. Understanding when that…
Versioning A Grails Database With Liquibase
A Grails application can change quickly while its database remains shared by developers, test environments, staging servers and production systems. Without a…
Managing Grails Database Migrations With Flyway
A database schema is part of a Grails application’s source code, even when it lives in a separate PostgreSQL, MySQL, or MariaDB server. Tables, indexes,…
Localising Grails views with message bundles
A Grails view often begins with English in headings, labels, paragraphs, and validation messages. That is fine for one audience, but changing wording or adding…
Validating Grails Forms with Command Objects
HTML form data is untrusted input, even when the browser has required fields and the page looks correct. Grails provides a useful boundary between transport…
Using Groovy Traits for Cross-Cutting Concerns in Grails Services
Grails services often end up carrying the same handful of responsibilities regardless of the domain they sit in. Logging who did what, checking whether a…
Automating Grails Build with Gradle Composite Builds
A Grails application often begins as a single project, with domain classes, services, controllers and configuration living in one repository. As the codebase…
Building Geb Page Objects for Reliable Grails End-to-End Tests
Geb is a browser automation library that sits comfortably on top of WebDriver and reads almost like ordinary Groovy. For Grails teams, the real payoff comes…
Using Spock Data Tables to Test Grails Controllers
Grails controllers often contain a deceptively large number of decisions. A request may be accepted for one HTTP method, rejected for another, redirected when…
Securing Grails applications with JWT access tokens
JSON Web Tokens (JWTs) give a Grails application a compact way to represent an authenticated user between requests. After a successful login, the server issues…