When we want to transform a Promise
value we can use the map
and flatMap
methods.
There are also variants to this methods that will only transform a value when a given predicate is true: mapIf
and flatMapIf
.
We provide a predicate and function to the methods.
If the predicate is true the function is invoked, otherwise the function is not invoked and the promised value is returned as is.
In the following example we have two methods that use the mapIf
and flatMapIf
methods of the Promise
class:
Continue reading →
Testing a Ratpack application is not difficult.
Ratpack has excellent support for writing unit and integration tests.
When we create the fixture MainClassApplicationUnderTest
we can override the method addImpositions
to add mock objects to the application.
We can add them using the ImpositionsSpec
object.
When the application starts with the test fixture the provided mock objects are used instead of the original objects.
For a Groovy based Ratpack application we can do the same thing when we create the fixture GroovyRatpackMainApplicationUnderTest
.
We start with a simple Java Ratpack application.
The application adds an implementation of a NumberService
interface to the registry.
A handler uses this implementation for rendering some output.
Continue reading →
We have several options to define a Ratpack application.
We can use a Java syntax to set up the bindings and handlers.
Or we can use the very nice Groovy DSL.
It turns out we can use both together as well.
For example we can define the handlers with the Groovy DSL and the rest of the application definition is written in Java.
To combine both we start with the Java configuration and use the bindings
and handlers
method of the Groovy.Script
class to inject the files with the Groovy DSL.
We start with a sample application where we use Java configuration to set up our Ratpack application:
Continue reading →
One of the very nice features of Ratpack is the Groovy DSL to define our application.
We get a nice DSL to set up the registry, to define handlers and more.
Because of clever use of the @DelegateTo
annotation we get good code completion in our IDE.
We can also add static compilation of our Groovy DSL when we start our Ratpack application.
With static compilation the script is type checked at compile time so we get earlier feedback on possible errors in the script.
To configure static compilation we must invoke the app
method of the Groovy.Script
class with the argument true
.
We start with a Groovy DSL for an application that serves recipes.
Notice the Closure
arguments are all typed, so with type checking there are no errors.
Continue reading →
Ratpack uses renderers to render output. We can create our own renderer by implementing the Renderer
interface.
The renderer class needs to implement a render
method that has the object we want to render as argument.
Alternatively we can add the logic to render a object to the class definition of that object.
So instead of having a separate renderer class for a class, we add the render logic to the class itself.
To achieve this we must implement the Renderable
interface for our class.
Ratpack provides a RenderableRenderer
in the registry that knows how to render classes that implement the Renderable
interface.
In the following example we have a Recipe
class that implements the Renderable
interface:
Continue reading →
Ratpack has parsers to parse a request with a JSON body or a HTML form. We simply use the parse
method of Context
and Ratpack will check if there is a compliant parser in the registry.
If there is a parser for that type available then Ratpack will parse the request and return a Promise
with the value.
To write a new parser we need to implement the Parser
interface.
The easiest way to implement this interface is by writing a class that extends ParserSupport
.
Using the ParserSupport
class we can also work with an options object that a user can pass on to the parse
method of Context
.
If we don’t need options we can also extend the NoOptParserSupport
class.
Let’s write a custom parser that can parse a request with a hex or base64 encoded value.
The parser returns a String
object with the decoded value.
In our example we also want the user to provide an optional options object of type StringParserOpts
which denotes the type of decoding:
Continue reading →
In a previous post we learned about Spring Cloud Contract.
We saw how we can use contracts to implement the server side of the contract.
But Spring Cloud Contract also creates a stub based on the contract.
The stub server is implemented with Wiremock and Spring Boot.
The server can match incoming requests with the contracts and send back the response as defined in the contract.
Let’s write an application that is invoking HTTP requests on the server application we wrote before.
In the tests that we write for this client application we use the stub that is generated by Spring Cloud Contract.
We know the stub is following the contract of the actual server.
First we create the stub in our server project with the Gradle task verifierStubsJar
.
The tests in the client application need these stub and will fetch it as dependency from a Maven repository or the local Maven repository.
For our example we use the local Maven repository.
We add the maven-publish
plugin to the server project and run the task publishToMavenLocal
.
Continue reading →
Spring Cloud Contract is a project that allows to write a contract for a service using a Groovy DSL.
In the contract we describe the expected requests and responses for the service.
From this contract a stub is generated that can be used by a client application to test the code that invokes the service.
Spring Cloud Contract also generates tests based on the contract for the service implementation.
Let’s see how we can use the generated tests for the service implementation for a Ratpack application.
Spring Cloud Contract comes with a Gradle plugin.
This plugin adds the task generateContractTests
that creates tests based on the contract we write.
There are also tasks to create the stub for a client application, but here we focus on the server implementation.
In the following Gradle build file for our Ratpack application we use the Spring Cloud Contract Gradle plugin.
We configure the plugin to use Spock as framework for the generated tests.
Continue reading →
When we need to create a URI
object in Ratpack we can use the HttpUrlBuilder
class.
We use several methods to build up a complete URI
object in an easy way.
This is very useful when we for example use Ratpack’s HttpClient
object and we need to pass an URI
to do a request.
In the following example specification we see several usages of the HttpUrlBuilder
class:
Continue reading →
The Pair
class in Ratpack is an easy way to create a growing data structure, passed on via Promise
methods.
A Pair
object has a left and right part containing data.
These parts can even be other Pair
objects.
Since Ratpack 1.4.0 the Promise
class has methods to set the right or left part of a Pair
: left
, flatLeft
, right
and flatRight
.
The result of these methods is a Promise<Pair>
object.
The input can be Promise
type or a Function
that can use a previous Promise
.
In the following example specification we use the different new methods to create a Pair
.
We also create a simple Ratpack server with a asynchronous HTTP client implementation to simulate remote calls returning a Promise
:
Continue reading →
Suppose we want to support partial JSON responses in our Ratpack application.
The user must send a request parameter with a list of fields that need to be part of the response.
In our code we must use the value of the request parameter and output only the given properties of an object.
We implement this logic using a custom renderer in Ratpack.
Inside the renderer we can get access to the request parameters of the original request.
In our example Ratpack application we have a Course
class, which is a simple class withs some properties:
Continue reading →
Ratpack has a lot of options to add configuration data to our application.
We can use for example YAML and JSON files, properties, environment variables and Java system properties.
Groovy has the ConfigSlurper
class to parse Groovy script with configuration data.
It even supports an environments
block to set configuration value for a specific environment.
If we want to support Groovy scripts as configuration definition we write a class that implements the ratpack.config.ConfigSource
interface.
We create a new class ConfigSlurperConfigSource
and implement the ConfigSource
interface.
We must implement the loadConfigData
method in which we read the Groovy configuration and transform it to a ObjectNode
so Ratpack can use it:
Continue reading →