R2DBC Tutorial
This tutorial demonstrates using R2DBC logic within WoOF.
It is a simple application to retrieve data from a database. The REST endpoint configuration for this tutorial is the following:
retrieveData:
class: net.officefloor.tutorial.r2dbchttpserver.R2dbcLogic
method: retrieveData
next: send
send:
class: net.officefloor.tutorial.r2dbchttpserver.R2dbcLogic
method: send
Reactive logic
The following is the R2DBC logic to retrieve the data:
public Mono<Message> retrieveData(@HttpPathParameter("id") String id, R2dbcSource source) {
return source.getConnection()
.flatMap(connection -> Mono.from(connection.createStatement("SELECT CONTENT FROM MESSAGE WHERE ID = $1")
.bind(0, Integer.parseInt(id)).execute()))
.flatMap(result -> Mono.from(result.map((row, metadata) -> {
String content = row.get(0, String.class);
return new Message(content);
})));
}
The R2dbcSource provides access to obtain a connection.
To enable the returned Reator types to be handled natively by OfficeFloor, add the following:
<dependency>
<groupId>net.officefloor.reactor</groupId>
<artifactId>officereactor</artifactId>
</dependency>
OfficeFloor will subscribe to the returned Mono. The success is passed as parameter to the next procedure (sending it as response):
public void send(@Parameter Message message, ObjectResponse<Message> response) {
response.send(message);
}
R2DBC
To have the R2DBC available, add the following:
<dependency>
<groupId>net.officefloor.persistence</groupId>
<artifactId>officer2dbc</artifactId>
</dependency>
<!-- Also include appropriate R2DBC libraries for particular database -->
<dependency>
<groupId>io.r2dbc</groupId>
<artifactId>r2dbc-h2</artifactId>
</dependency>
<dependency>
<groupId>io.r2dbc</groupId>
<artifactId>r2dbc-pool</artifactId>
</dependency>
then configure as follows in the officefloor/objects/ directory:
managed-object:
source: net.officefloor.jdbc.h2.H2DataSourceManagedObjectSource
properties:
url: "jdbc:h2:mem:exampleDb;DB_CLOSE_DELAY=-1"
user: sa
password: password
managed-object:
source: net.officefloor.r2dbc.R2dbcManagedObjectSource
properties:
driver: pool
protocol: h2:mem
database: exampleDb
user: sa
password: password
with example properties:
driver=pool
protocol=h2:mem
database=exampleDb
user=sa
password=password
Testing
The following shows invoking the R2DBC code that asynchronously retrieves data:
@RegisterExtension
public final MockWoofServerExtension server = new MockWoofServerExtension();
@Test
public void getData() {
MockWoofResponse response = this.server.send(MockWoofServer.mockRequest("/message/1"));
response.assertJson(200, new Message("TEST"));
}
Next
The next tutorial covers using Vertx SQL Client.

