Spring Data R2dbc PostgreSQL example
March 4, 2019
Tweet
In this post, we will be creating a reactive rest application using Spring webFlux and spring-data-r2dbc
Dependency required for spring-data-r2dbc
<!-- webflux -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
</dependency>
<!-- spring-data-r2dbc-->
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-r2dbc</artifactId>
<version>${spring-data-r2dbc.version}</version>
</dependency>
<dependency>
<groupId>io.r2dbc</groupId>
<artifactId>r2dbc-postgresql</artifactId>
<version>${r2dbc.version}</version>
</dependency>
Setup your environment
- This example use docker in locally to spin up postgreSQL
- If you have Docker installed in your system, please run the following command to start PostgreSQL and Adminer (Database management web tool)
docker-compose -f docker/docker-compose.yml up
- Verify postgreSQL is up and running
docker ps -a | grep postgres
output
48414afd73fc postgres "docker-entrypoint.s…" 2 days ago etc....
- Verify Adminer (Database management web tool) is up and running
docker ps -a | grep adminer
output
3b2402e3d8cb adminer "entrypoint.sh docke…" 2 days ago
- You can access Adminer from browser using the following url
http://localhost:8080/
Register ConnectionFactory
@Configuration
@EnableR2dbcRepositories(basePackages = "com.nbenja.spring.r2dbcpostgresqlexample.repository")
public class R2dbcPostgresqlConfiguration extends AbstractR2dbcConfiguration {
@Value("${datasource.host}")
private String host;
@Value("${datasource.port}")
private int port;
@Value("${datasource.database}")
private String database;
@Value("${datasource.username}")
private String username;
@Value("${datasource.password}")
private String password;
@Bean
@Override
public PostgresqlConnectionFactory connectionFactory() {
return new PostgresqlConnectionFactory(PostgresqlConnectionConfiguration
.builder()
.host(host)
.database(database)
.username(username)
.password(password)
.port(port)
.build());
}
}
Once we extend AbstractR2dbcConfiguration
and provide the right ConnectionFactory
spring-data-r2dbc framework will register DatabaseClient
for database interaction for Repository implementation.
Configure your Repository
Currently spring-data-r2dbc
provide two interaces to the Repository layer.
- R2dbcRepository
- ReactiveCrudRepository
In our example we extend ReactiveCrudRepository
public interface UserRepository extends ReactiveCrudRepository<User, Integer> {
}
Unit test
The unit testcases will be using TestContainers to spin up the lightweight postgresql container instance.
Running the application
Right click and runR2dbcPostgresqlExampleApplication
from any IDE or you can run
from command line using the following
java -jar target/r2dbc-postgresql-example-0.0.1-SNAPSHOT.jar
Create a new USER
curl -X POST \
http://localhost:7878/users \
-H 'Content-Type: application/json' \
-d '{
"name": "demo"
}'
get all USERS
curl -X GET http://localhost:7878/users
response:
[{"id":1,"name":"demo"}]%
The code used in this article can be found here .