Since Grails 3 the logging configuration is in a separate file. Before Grails 3 we could specify the logging configuration in grails-app/conf/Config.groovy
, since Grails 3 it is in the file grails-app/conf/logback.groovy
. We also notice that since Grails 3 the default logging framework implementation is Logback. We can define a different Logback configuration file with the environment configuration property logging.config
. We can set this property in grails-app/conf/application.yml
, as Java system property (-Dlogging.config=<location>
) or environment variable (LOGGING_CONFIG
). Actually all rules for external configuration of Spring Boot apply for the configuration property logging.config
.
In the following example configuration file we have a different way of logging in our Grails application. We save it as grails-app/conf/logback-grails.groovy
:
Continue reading →
With Grails 3 we get the Spring Boot mechanism for loading external configuration files. The default base name for configuration files is application
. Grails creates for example the file grails-app/conf/application.yml
to store configuration values if we use the create-app
command. To change the base name from application
to something else we must specify a value for the Java system property spring.config.name
.
In the following example we start Grails with the value config
for the Java system property spring.config.name
. So now Grails looks for file names like config.yml
, config.properties
, config-{env}.properties
and config-{env}.yml
in the default locations config
directory, root directory on the filesystem and in the class path.
Continue reading →
Both the JVM and keytool have problems dealing with keystores without a password. If you try to get a listing of the keystore it will think you didn't provide a password and output falsehoods:
$ keytool -list -storetype pkcs12 -keystore keystoreWithoutPassword.p12
Enter keystore password:
***************** WARNING WARNING WARNING *****************
* The integrity of the information stored in your keystore *
* has NOT been verified! In order to verify its integrity, *
* you must provide your keystore password. *
***************** WARNING WARNING WARNING *****************
Keystore type: PKCS12
Keystore provider: SunJSSE
Your keystore contains 1 entry
tammo, Oct 14, 2015, SecretKeyEntry,
Continue reading →
A Grails 3 application uses the same mechanism to load external configuration files as a Spring Boot application. This means the default locations are the root directory or config/
directory in the class path and on the file system. If we want to specify a new directory to search for configuration files or specify the configuration files explicitly we can use the Java system property spring.config.location
.
In the following example we have a configuration application.yml
in the settings
directory. The default base name for a configuration file is application
, so we use that base name in our example. In this sample we use a YAML configuration file where we override the property sample.config
for the Grails production environment.
Continue reading →
Since Grails 3 we can use a random value for a configuration property. This is because Grails now uses Spring Boot and this adds the RandomValuePropertySource
class to our application. We can use it to produce random string, integer or lang values. In our configuration we only have to use ${random.<type>}
as a value for a configuration property. If the type is int
or long
we get a Integer
or Long
value. We can also define a range of Integer
or Long
values that the generated random value must be part of. The syntax is ${random.int[<start>]}
or ${random.int[<start>,<end>}
. For a Long
value we replace int
with long
. It is also very important when we define an end value that there cannot be any spaces in the definition. Also the end value is exclusive for the range. If the type is something else then int
or long
a random string value is generated. So we could use any value after the dot (.
) in ${random.<type>}
to get a random string value.
In the following example configuration file we use a random value for the configuration properties sample.random.password
, sample.random.longNumber
and sample.random.number
:
Continue reading →
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 →
A lot of bugs are in some way related to state. So that is what we will be talking about today. We will start off with a quote from Einstein: “Insanity: doing the same thing over and over again and expecting different results. ” Code should be consistent, calling the same function with the same input should return the same result during the whole life cycle of the object. Insanity and bugs will follow if this rule is violated. This sounds logical, but in practise it is quite easy to violate this principle. The main cause of this, is object state. This state is used in a lot of functions, and can thus affect the behaviour of our program at runtime. This principle can be even be seen in the most basic of examples (imagine the impact on a more complicated class...). Given the following class:
public class Person {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
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 →