Grails 3 is build on top of Spring Boot and this adds a lot of the Spring Boot features to our Grails application. For example in Spring Boot we can store configuration properties in an external file. A default Grails application already adds application.yml
in the grails-app/conf
directory. If we want to specify different values for a configuration property for each environment (like development, test and production) we can use environment
section in application.yml
. We know this from previous Grails versions with a Groovy configuration file Config.groovy
. But we can also create different configuration files per environment and set the value for the configuration property in each file. We can use the following naming pattern for the file: application-{env}.yml
or application-{env}.properties
. These files need be in:
- a
config
directory in the directory the application is running from
- the root of the directory the application is running from
- in a
/config
package on the classpath
- in the root of the classpath
Continue reading →
Grails 3 introduces GrailsAutoConfiguration
as the base class for a Grails application. We can extend this class, add a main
method and we are ready to go. By default this class is the Application
class in the grails-app/init
directory. We can override several Grails lifecycle methods from the GrailsAutoConfiguration
base class. One of them is doWithSpring
. This method must return a closure that can be used by the Grails BeanBuilder
class to add Spring beans to the application context. The closure has the same syntax as what we already know for the grails-app/conf/spring/resources.groovy
file, we know from previous Grails versions.
We start with a simple class we want to use as a Spring bean:
Continue reading →
In a previous post we learned how to pass Java system properties from the command-line to a Java process defined in a Gradle build file. Because Grails 3 uses Gradle as the build tool we can apply the same mechanism in our Grails application. We need to reconfigure the run
task. This task is of type JavaExec
and we can use the method systemProperties
to assign the system properties we define on the command-line when we invoke the run
task.
We have a simple Grails 3 application with the following controller that tries to access the Java system property sample.message
:
Continue reading →
Since Grails 3 is based on Spring Boot we can re-use many of the Spring Boot features in our Grails application. For example in a Spring Boot application we can use environment variables to give configuration properties a value. We simply need to follow some naming rules: the name of the configuration property must be in uppercase and dots are replaced with underscores. For example a configuration property feature.enabled
is represented by the environment variable FEATURE_ENABLED
.
We create the following controller in a Grails 3 application with a message
property. The value is set with the @Value
annotation of the underlying Spring framework. With this annotation we tell the application to look for an (external) configuration property sample.message
and assign it's value to the message
property. If it cannot be set via a configuration property the default value is "gr8".
Continue reading →
In Grails we can use the list-plugins
command to get a list of all available plugins. The list returns only the plugins that are available for the Grails version we are using. So if we invoke this command in Grails 3 we get a different list than a Grails 2.x version. To get more detailed information, like website, source code URL and dependency definition we use the plugin-info
command.
Let's run the plugin-list
command for Grails 3:
Continue reading →
Creating and working with mocks and stubs in Spock is easy. If we want to interact with our mocks and stubs we have several options to return values. One of the options is the triple right shift operator >>>
. With this operator we can define different return values for multiple invocations of the stubbed or mocked method. For example we can use the >>>
operator followed by a list of return values ['abc', 'def', 'ghi']
. On the first invocation abc
is return, the second invocation returns def
and the third (and following) invocation(s) return ghi
.
In the following specification we have a class under test StringUtil
. The class has a dependency on an implementation of the Calculator
interface. We mock this interface in our specification. We expect the calculateSize
method is invoked 5 times, but we only provide 3 values for the invocations. This means the first time 1
is used, the second time 3
is used and the remaining invocations get the value 4
:
Continue reading →
A very useful feature in Groovy is the use of named arguments. Instead of a list of arguments for a method or constructor we can use a Map
argument. If the argument is the first in the list of arguments then Groovy allows use to use named arguments when we invoke the method or constructor. This means all key/value arguments are gathered together and assigned to the Map
argument. Inside our method or constructor we can then access the Map
argument and get the values for the keys. This leads to better readable code and that is very useful. IntelliJ IDEA has a Groovy intention to turn method parameters into a Map
parameter for named arguments with a few mouse clicks.
Suppose we have the following source code with a simple
method definition, 2 arguments, and the invocation of the method:
Continue reading →
IntelliJ IDEA has very good Groovy support. It also provides some intentions especially for the Groovy language. For example we can turn a map definition into a Groovy class definition with a few simple clicks.
The following screenshot shows a simple map declaration with two keys: username
and alias
. If we use the shortcut for intentions (Alt+Enter on my computer) we can choose the Convert to Class option:
Continue reading →
In a previous post we learned that configuration property values can be passed via environment variables. With Spring Boot we can also pass the values using Java system properties. So if we have a property sample.message
then we can use -Dsample.message=value
to pass a value when we run the application. If we use the Spring Boot Gradle plugin we must reconfigure the bootRun
task to pass Java system properties from the command-line.
Let's reuse our sample application from the previous blog post:
Continue reading →
Gradle is of course a great build tool for Java related projects. If we have tasks in our projects that need to execute a Java application we can use the JavaExec
task. When we need to pass Java system properties to the Java application we can set the systemProperties
property of the JavaExec
task. We can assign a value to the systemProperties
property or use the method systemProperties
that will add the properties to the existing properties already assigned. Now if we want to define the system properties from the command-line when we run Gradle we must pass along the properties to the task. Therefore we must reconfigure a JavaExec
task and assign System.properties
to the systemProperties
property.
In the following build script we reconfigure all JavaExec
tasks in the project. We use the systemProperties
method and use the value System.properties
. This means any system properties from the command-line are passed on to the JavaExec
task.
Continue reading →
To see which tasks are available for a Gradle project we can invoke the tasks
task. With this task all tasks are printed to the console with their description. To get more information about a specific task we can use the Gradle help
task with the command-line option --task
followed by the task name. Gradle prints out the path, type, description, group and optional options for the task.
Let's run the help
task for the wrapper
task:
Continue reading →
Spring Boot has many options for externalising the configuration of our application. One of the options it to use OS environment variables. We need to follow certain rules to name the environment variable and then Spring Boot will use the value of variable to set a configuration property. The property name must be in uppercase and any dots need to be replaced with underscores. For example the configuration property sample.message
is set with the environment variable SAMPLE_MESSAGE
. This feature can be useful in a continuous integration environment where we can set environment variables or just when developing locally. The nice thing is that this also works when we use the Spring Boot Gradle plugin. The environment variables are passed on to the Java process that the bootRun
task starts.
The following source file is a simple Spring Boot command-line application. The sample.message
property can be configured as by Spring. If there is no value set the default value "default"
is used.
Continue reading →