Skip to content

Commit 2fa9870

Browse files
authored
upgrade-to-java-21 (#4)
* update to java 21 * change schema
1 parent 50ab781 commit 2fa9870

20 files changed

+241
-227
lines changed

README.md

+4-4
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,13 @@
33
An example implementation of Spring Boot R2DBC REST API with PostgreSQL database.
44

55
## Technology stack
6-
* Java 17
6+
* Java 21
77
* Maven
8-
* PostgreSQL 16.1
8+
* PostgreSQL 17
99
* Docker
1010

1111
## Java Dependencies
12-
* Spring Boot 3.2.1
12+
* Spring Boot 3.4.1
1313
* Spring Data R2DBC
1414
* R2DBC PostgreSQL Driver
1515
* JUnit 5
@@ -30,7 +30,7 @@ An example implementation of Spring Boot R2DBC REST API with PostgreSQL database
3030

3131
2. Run generated docker image
3232

33-
`docker run -it -p8080:8080 --network="host" reactive-postgres:0.0.2-SNAPSHOT`
33+
`docker run -it -p8080:8080 --network="host" reactive-postgres:0.0.3-SNAPSHOT`
3434

3535

3636

docker-compose.yml

+1-2
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
1-
version: '3.8'
21
services:
32
postgresql:
43
container_name: db-postgres
5-
image: postgres:16.1
4+
image: postgres:17
65
ports:
76
- "5432:5432"
87
environment:

mvnw

100644100755
File mode changed.

pom.xml

+10-7
Original file line numberDiff line numberDiff line change
@@ -15,17 +15,17 @@
1515
<parent>
1616
<groupId>org.springframework.boot</groupId>
1717
<artifactId>spring-boot-starter-parent</artifactId>
18-
<version>3.2.1</version>
18+
<version>3.4.1</version>
1919
<relativePath/> <!-- lookup parent from repository -->
2020
</parent>
2121
<groupId>dev.kamalhm</groupId>
2222
<artifactId>reactive-postgres</artifactId>
23-
<version>0.0.2-SNAPSHOT</version>
23+
<version>0.0.3-SNAPSHOT</version>
2424
<name>reactive-postgres</name>
25-
<description>Demo project for Spring Boot</description>
25+
<description>Example Spring Boot with R2DBC project</description>
2626

2727
<properties>
28-
<java.version>17</java.version>
28+
<java.version>21</java.version>
2929
</properties>
3030

3131
<dependencies>
@@ -45,10 +45,9 @@
4545
<optional>true</optional>
4646
</dependency>
4747
<dependency>
48-
<groupId>io.r2dbc</groupId>
48+
<groupId>org.postgresql</groupId>
4949
<artifactId>r2dbc-postgresql</artifactId>
50-
<version>0.8.6.RELEASE</version>
51-
<scope>runtime</scope>
50+
<version>1.0.7.RELEASE</version>
5251
</dependency>
5352
<dependency>
5453
<groupId>org.postgresql</groupId>
@@ -80,6 +79,10 @@
8079
<artifactId>commons-lang3</artifactId>
8180
<version>3.11</version>
8281
</dependency>
82+
<dependency>
83+
<groupId>org.springframework.boot</groupId>
84+
<artifactId>spring-boot-starter-actuator</artifactId>
85+
</dependency>
8386
</dependencies>
8487

8588
<build>

src/main/java/dev/kamalhm/reactivepostgres/ReactivePostgresApplication.java

+12-12
Original file line numberDiff line numberDiff line change
@@ -14,17 +14,17 @@
1414
@EnableR2dbcAuditing
1515
public class ReactivePostgresApplication {
1616

17-
public static void main(String[] args) {
18-
SpringApplication.run(ReactivePostgresApplication.class, args);
19-
}
17+
public static void main(String[] args) {
18+
SpringApplication.run(ReactivePostgresApplication.class, args);
19+
}
2020

21-
@Bean
22-
ConnectionFactoryInitializer initializer(@Qualifier("connectionFactory") ConnectionFactory connectionFactory) {
23-
ConnectionFactoryInitializer initializer = new ConnectionFactoryInitializer();
24-
initializer.setConnectionFactory(connectionFactory);
25-
ResourceDatabasePopulator resource =
26-
new ResourceDatabasePopulator(new ClassPathResource("schema.sql"));
27-
initializer.setDatabasePopulator(resource);
28-
return initializer;
29-
}
21+
@Bean
22+
ConnectionFactoryInitializer initializer(@Qualifier("connectionFactory") ConnectionFactory connectionFactory) {
23+
ConnectionFactoryInitializer initializer = new ConnectionFactoryInitializer();
24+
initializer.setConnectionFactory(connectionFactory);
25+
ResourceDatabasePopulator resource =
26+
new ResourceDatabasePopulator(new ClassPathResource("schema.sql"));
27+
initializer.setDatabasePopulator(resource);
28+
return initializer;
29+
}
3030
}

src/main/java/dev/kamalhm/reactivepostgres/config/PostgresAuditorAwareConfiguration.java

+4-4
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,9 @@
99
@Configuration
1010
public class PostgresAuditorAwareConfiguration {
1111

12-
@Bean
13-
ReactiveAuditorAware<String> auditorAware() {
14-
return () -> Mono.just("AUDITOR");
15-
}
12+
@Bean
13+
ReactiveAuditorAware<String> auditorAware() {
14+
return () -> Mono.just("AUDITOR");
15+
}
1616

1717
}

src/main/java/dev/kamalhm/reactivepostgres/controller/BalanceController.java

+6-9
Original file line numberDiff line numberDiff line change
@@ -17,15 +17,12 @@
1717
@Slf4j
1818
public class BalanceController {
1919

20-
private final BalanceRepository balanceRepository;
20+
private final BalanceRepository balanceRepository;
2121

22-
@PostMapping
23-
public Mono<Balance> createBalance(@RequestBody CreateBalanceWebRequest request) {
24-
final Balance balance = Balance.builder()
25-
.balance(request.getBalance())
26-
.memberId(request.getMemberId())
27-
.build();
28-
return balanceRepository.save(balance);
29-
}
22+
@PostMapping
23+
public Mono<Balance> createBalance(@RequestBody CreateBalanceWebRequest request) {
24+
final Balance balance = new Balance(request.getMemberId(), request.getBalance());
25+
return balanceRepository.save(balance);
26+
}
3027

3128
}

src/main/java/dev/kamalhm/reactivepostgres/controller/MemberController.java

+33-33
Original file line numberDiff line numberDiff line change
@@ -23,44 +23,44 @@
2323
@Slf4j
2424
public class MemberController {
2525

26-
private final MemberRepository memberRepository;
26+
private final MemberRepository memberRepository;
2727

28-
@GetMapping
29-
public Flux<Member> getAll() {
30-
return memberRepository.findAll();
31-
}
28+
@GetMapping
29+
public Flux<Member> getAll() {
30+
return memberRepository.findAll();
31+
}
3232

33-
@GetMapping(value = "/{name}")
34-
public Mono<Member> getOne(@PathVariable String name) {
35-
return memberRepository.findByName(name);
36-
}
33+
@GetMapping(value = "/{name}")
34+
public Mono<Member> getOne(@PathVariable String name) {
35+
return memberRepository.findByName(name);
36+
}
3737

38-
@PostMapping
39-
public Mono<Member> createMember(@RequestBody Member member) {
40-
return memberRepository.save(member);
41-
}
38+
@PostMapping
39+
public Mono<Member> createMember(@RequestBody Member member) {
40+
return memberRepository.save(member);
41+
}
4242

43-
@PostMapping(value = "/{number}")
44-
public Flux<Member> createMembers(@PathVariable int number) {
45-
return generateRandomMember(number).subscribeOn(Schedulers.boundedElastic());
46-
}
43+
@PostMapping(value = "/{number}")
44+
public Flux<Member> createMembers(@PathVariable int number) {
45+
return generateRandomMember(number).subscribeOn(Schedulers.boundedElastic());
46+
}
4747

48-
private Flux<Member> generateRandomMember(int number) {
49-
return Mono.fromSupplier(
50-
() -> Member.builder().name(RandomStringUtils.randomAlphabetic(5)).build())
51-
.flatMap(memberRepository::save)
52-
.repeat(number);
53-
}
48+
private Flux<Member> generateRandomMember(int number) {
49+
return Mono.fromSupplier(
50+
() -> new Member(RandomStringUtils.randomAlphabetic(5)))
51+
.flatMap(memberRepository::save)
52+
.repeat(number);
53+
}
5454

55-
@PutMapping
56-
public Mono<Member> updateMember(@RequestBody Member member) {
57-
return memberRepository
58-
.findByName(member.getName())
59-
.flatMap(memberResult -> memberRepository.save(member));
60-
}
55+
@PutMapping
56+
public Mono<Member> updateMember(@RequestBody Member member) {
57+
return memberRepository
58+
.findByName(member.name())
59+
.flatMap(memberResult -> memberRepository.save(member));
60+
}
6161

62-
@DeleteMapping
63-
public Mono<Void> deleteMember(@RequestBody Member member) {
64-
return memberRepository.deleteById(member.getId());
65-
}
62+
@DeleteMapping
63+
public Mono<Void> deleteMember(@RequestBody Member member) {
64+
return memberRepository.deleteById(member.id());
65+
}
6666
}

src/main/java/dev/kamalhm/reactivepostgres/controller/TransactionController.java

+6-6
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,11 @@
1818
@Slf4j
1919
public class TransactionController {
2020

21-
private final TransactionalService transactionalService;
21+
private final TransactionalService transactionalService;
2222

23-
@PostMapping
24-
@Transactional
25-
public Mono<Balance> createTransaction(@RequestBody CreateTransactionWebRequest request) {
26-
return transactionalService.doTransaction(request);
27-
}
23+
@PostMapping
24+
@Transactional
25+
public Mono<Balance> createTransaction(@RequestBody CreateTransactionWebRequest request) {
26+
return transactionalService.doTransaction(request);
27+
}
2828
}

src/main/java/dev/kamalhm/reactivepostgres/dto/CreateBalanceWebRequest.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,6 @@
55
@Data
66
public class CreateBalanceWebRequest {
77

8-
private String memberId;
9-
private Long balance;
8+
private Long memberId;
9+
private Long balance;
1010
}

src/main/java/dev/kamalhm/reactivepostgres/dto/CreateTransactionWebRequest.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
@Data
66
public class CreateTransactionWebRequest {
77

8-
private String from;
9-
private String to;
8+
private Long from;
9+
private Long to;
1010
private Long amount;
1111
}
Original file line numberDiff line numberDiff line change
@@ -1,34 +1,23 @@
11
package dev.kamalhm.reactivepostgres.entity;
22

3-
import java.util.UUID;
4-
import lombok.Builder;
5-
import lombok.Data;
63
import org.springframework.data.annotation.CreatedBy;
74
import org.springframework.data.annotation.CreatedDate;
85
import org.springframework.data.annotation.Id;
96
import org.springframework.data.annotation.LastModifiedBy;
107
import org.springframework.data.annotation.LastModifiedDate;
118
import org.springframework.data.relational.core.mapping.Column;
129

13-
@Builder
14-
@Data
15-
public class Balance {
16-
17-
@Id
18-
private UUID id;
19-
@Column("member_id")
20-
private String memberId;
21-
private Long balance;
22-
@CreatedBy
23-
@Column("created_by")
24-
private String createdBy;
25-
@CreatedDate
26-
@Column("created_date")
27-
private Long createdDate;
28-
@LastModifiedBy
29-
@Column("last_modified_by")
30-
private String lastModifiedBy;
31-
@LastModifiedDate
32-
@Column("last_modified_date")
33-
private Long lastModifiedDate;
10+
public record Balance(
11+
@Id Long id,
12+
@Column("member_id") Long memberId,
13+
Long balance,
14+
@CreatedBy @Column("created_by") String createdBy,
15+
@CreatedDate @Column("created_date") Long createdDate,
16+
@LastModifiedBy @Column("last_modified_by") String lastModifiedBy,
17+
@LastModifiedDate @Column("last_modified_date") Long lastModifiedDate
18+
) {
19+
public Balance(Long memberId, Long balance) {
20+
this(null, memberId, balance, null, null, null, null);
21+
}
3422
}
23+
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,10 @@
11
package dev.kamalhm.reactivepostgres.entity;
22

3-
import lombok.Builder;
4-
import lombok.Data;
53
import org.springframework.data.annotation.Id;
64

5+
public record Member(@Id Long id, String name) {
6+
public Member(String name) {
7+
this(null, name); // `id` is null, it will be auto-generated when persisted
8+
}
79

8-
@Builder
9-
@Data
10-
public class Member {
11-
12-
@Id
13-
private Long id;
14-
private String name;
1510
}

src/main/java/dev/kamalhm/reactivepostgres/repository/BalanceRepository.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,6 @@
44
import org.springframework.data.r2dbc.repository.R2dbcRepository;
55
import reactor.core.publisher.Mono;
66

7-
public interface BalanceRepository extends R2dbcRepository<Balance, String> {
8-
Mono<Balance> findByMemberId(String memberId);
7+
public interface BalanceRepository extends R2dbcRepository<Balance, Long> {
8+
Mono<Balance> findByMemberId(Long memberId);
99
}

src/main/java/dev/kamalhm/reactivepostgres/repository/MemberRepository.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -5,5 +5,5 @@
55
import reactor.core.publisher.Mono;
66

77
public interface MemberRepository extends R2dbcRepository<Member, Long> {
8-
Mono<Member> findByName(String name);
8+
Mono<Member> findByName(String name);
99
}

0 commit comments

Comments
 (0)