[JAVA-27763] Upgrade spring-reactive-client module to Spring Boot 3 (#16187)
This commit is contained in:
parent
c4a14c6931
commit
c53d0f44f4
@ -9,9 +9,10 @@
|
||||
<description>spring boot sample project about new features</description>
|
||||
|
||||
<parent>
|
||||
<groupId>com.baeldung.spring.reactive</groupId>
|
||||
<artifactId>spring-reactive-modules</artifactId>
|
||||
<version>1.0.0-SNAPSHOT</version>
|
||||
<groupId>com.baeldung</groupId>
|
||||
<artifactId>parent-boot-3</artifactId>
|
||||
<version>0.0.1-SNAPSHOT</version>
|
||||
<relativePath>../../parent-boot-3</relativePath>
|
||||
</parent>
|
||||
|
||||
<dependencies>
|
||||
@ -42,8 +43,13 @@
|
||||
<version>${reactor-spring.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>javax.json.bind</groupId>
|
||||
<artifactId>javax.json.bind-api</artifactId>
|
||||
<groupId>jakarta.json.bind</groupId>
|
||||
<artifactId>jakarta.json.bind-api</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>jakarta.json</groupId>
|
||||
<artifactId>jakarta.json-api</artifactId>
|
||||
<version>${jakarta.json-api.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.apache.geronimo.specs</groupId>
|
||||
@ -53,6 +59,7 @@
|
||||
<dependency>
|
||||
<groupId>org.apache.johnzon</groupId>
|
||||
<artifactId>johnzon-jsonb</artifactId>
|
||||
<version>${johnzon-jsonb.version}</version>
|
||||
</dependency>
|
||||
<!-- utils -->
|
||||
<dependency>
|
||||
@ -92,7 +99,7 @@
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.github.tomakehurst</groupId>
|
||||
<groupId>org.wiremock</groupId>
|
||||
<artifactId>wiremock-standalone</artifactId>
|
||||
<version>${wiremock-standalone.version}</version>
|
||||
<scope>test</scope>
|
||||
@ -183,12 +190,14 @@
|
||||
<properties>
|
||||
<reactor-spring.version>1.0.1.RELEASE</reactor-spring.version>
|
||||
<geronimo-json_1.1_spec.version>1.0</geronimo-json_1.1_spec.version>
|
||||
<jetty-reactive-httpclient.version>1.1.6</jetty-reactive-httpclient.version>
|
||||
<jetty-reactive-httpclient.version>4.0.3</jetty-reactive-httpclient.version>
|
||||
<okhttp.version>5.0.0-alpha.12</okhttp.version>
|
||||
<reactor-test.version>3.5.3</reactor-test.version>
|
||||
<wiremock-standalone.version>2.26.0</wiremock-standalone.version>
|
||||
<spring-cloud-starter-openfeign.version>3.1.4</spring-cloud-starter-openfeign.version>
|
||||
<wiremock-standalone.version>3.4.2</wiremock-standalone.version>
|
||||
<spring-cloud-starter-openfeign.version>4.0.3</spring-cloud-starter-openfeign.version>
|
||||
<kotlin-stdlib.version>2.0.0-Beta4</kotlin-stdlib.version>
|
||||
<johnzon-jsonb.version>2.0.0</johnzon-jsonb.version>
|
||||
<jakarta.json-api.version>2.1.3</jakarta.json-api.version>
|
||||
</properties>
|
||||
|
||||
</project>
|
@ -2,7 +2,7 @@ package com.baeldung.reactive.controller;
|
||||
|
||||
|
||||
import com.baeldung.reactive.service.ReactiveUploadService;
|
||||
import org.springframework.http.HttpStatus;
|
||||
import org.springframework.http.HttpStatusCode;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
import org.springframework.web.multipart.MultipartFile;
|
||||
import reactor.core.publisher.Mono;
|
||||
@ -18,13 +18,13 @@ public class UploadController {
|
||||
|
||||
@PostMapping(path = "/upload")
|
||||
@ResponseBody
|
||||
public Mono<HttpStatus> uploadPdf(@RequestParam("file") final MultipartFile multipartFile) {
|
||||
public Mono<HttpStatusCode> uploadPdf(@RequestParam("file") final MultipartFile multipartFile) {
|
||||
return uploadService.uploadPdf(multipartFile.getResource());
|
||||
}
|
||||
|
||||
@PostMapping(path = "/upload/multipart")
|
||||
@ResponseBody
|
||||
public Mono<HttpStatus> uploadMultipart(@RequestParam("file") final MultipartFile multipartFile) {
|
||||
public Mono<HttpStatusCode> uploadMultipart(@RequestParam("file") final MultipartFile multipartFile) {
|
||||
return uploadService.uploadMultipart(multipartFile);
|
||||
}
|
||||
}
|
||||
|
@ -1,4 +1,5 @@
|
||||
package com.baeldung.reactive.service;
|
||||
|
||||
import com.baeldung.reactive.model.Employee;
|
||||
import org.springframework.web.reactive.function.client.WebClient;
|
||||
import reactor.core.publisher.Mono;
|
||||
|
@ -4,6 +4,7 @@ package com.baeldung.reactive.service;
|
||||
import com.baeldung.reactive.exception.ServiceException;
|
||||
import org.springframework.core.io.Resource;
|
||||
import org.springframework.http.HttpStatus;
|
||||
import org.springframework.http.HttpStatusCode;
|
||||
import org.springframework.http.MediaType;
|
||||
import org.springframework.http.client.MultipartBodyBuilder;
|
||||
import org.springframework.stereotype.Service;
|
||||
@ -26,10 +27,10 @@ public class ReactiveUploadService {
|
||||
}
|
||||
|
||||
|
||||
public Mono<HttpStatus> uploadPdf(final Resource resource) {
|
||||
public Mono<HttpStatusCode> uploadPdf(final Resource resource) {
|
||||
|
||||
final URI url = UriComponentsBuilder.fromHttpUrl(EXTERNAL_UPLOAD_URL).build().toUri();
|
||||
Mono<HttpStatus> httpStatusMono = webClient.post()
|
||||
Mono<HttpStatusCode> httpStatusMono = webClient.post()
|
||||
.uri(url)
|
||||
.contentType(MediaType.APPLICATION_PDF)
|
||||
.body(BodyInserters.fromResource(resource))
|
||||
@ -44,13 +45,13 @@ public class ReactiveUploadService {
|
||||
}
|
||||
|
||||
|
||||
public Mono<HttpStatus> uploadMultipart(final MultipartFile multipartFile) {
|
||||
public Mono<HttpStatusCode> uploadMultipart(final MultipartFile multipartFile) {
|
||||
final URI url = UriComponentsBuilder.fromHttpUrl(EXTERNAL_UPLOAD_URL).build().toUri();
|
||||
|
||||
final MultipartBodyBuilder builder = new MultipartBodyBuilder();
|
||||
builder.part("file", multipartFile.getResource());
|
||||
|
||||
Mono<HttpStatus> httpStatusMono = webClient.post()
|
||||
Mono<HttpStatusCode> httpStatusMono = webClient.post()
|
||||
.uri(url)
|
||||
.contentType(MediaType.MULTIPART_FORM_DATA)
|
||||
.body(BodyInserters.fromMultipartData(builder.build()))
|
||||
|
@ -3,6 +3,7 @@ package com.baeldung.webclient.status;
|
||||
import com.baeldung.webclient.status.exception.CustomBadRequestException;
|
||||
import com.baeldung.webclient.status.exception.CustomServerErrorException;
|
||||
import org.springframework.http.HttpStatus;
|
||||
import org.springframework.http.HttpStatusCode;
|
||||
import org.springframework.web.reactive.function.client.ClientResponse;
|
||||
import org.springframework.web.reactive.function.client.ExchangeFilterFunction;
|
||||
import org.springframework.web.reactive.function.client.WebClient;
|
||||
@ -40,7 +41,7 @@ public class WebClientStatusCodeHandler {
|
||||
}
|
||||
|
||||
private static Mono<ClientResponse> exchangeFilterResponseProcessor(ClientResponse response) {
|
||||
HttpStatus status = response.statusCode();
|
||||
HttpStatusCode status = response.statusCode();
|
||||
if (HttpStatus.INTERNAL_SERVER_ERROR.equals(status)) {
|
||||
return response.bodyToMono(String.class)
|
||||
.flatMap(body -> Mono.error(new CustomServerErrorException(body)));
|
||||
|
@ -1,5 +1,3 @@
|
||||
logging.level.root=INFO
|
||||
|
||||
server.port=8081
|
||||
|
||||
logging.level.reactor.netty.http.client.HttpClient=DEBUG
|
@ -5,10 +5,10 @@ import org.junit.runner.RunWith;
|
||||
import org.springframework.boot.test.context.SpringBootTest;
|
||||
import org.springframework.test.context.junit4.SpringRunner;
|
||||
|
||||
import com.baeldung.reactive.Spring5ReactiveTestApplication;
|
||||
import com.baeldung.reactive.SpringReactiveTestApplication;
|
||||
|
||||
@RunWith(SpringRunner.class)
|
||||
@SpringBootTest(classes = Spring5ReactiveTestApplication.class)
|
||||
@SpringBootTest(classes = SpringReactiveTestApplication.class)
|
||||
public class SpringContextTest {
|
||||
|
||||
@Test
|
||||
|
@ -49,7 +49,9 @@ public class ReactiveIntegrationTest {
|
||||
.withHeader("Content-Type", "application/json")
|
||||
.withBody("{\"id\":123, \"name\":\"foo\"}")));
|
||||
|
||||
final Mono<ClientResponse> fooMono = client.get().uri("/foo/123").exchange().log();
|
||||
final Mono<ClientResponse> fooMono = client.get().uri("/foo/123").retrieve()
|
||||
.bodyToMono(ClientResponse.class)
|
||||
.log();
|
||||
|
||||
System.out.println(fooMono.subscribe());
|
||||
}
|
||||
|
@ -9,7 +9,7 @@ import org.springframework.web.reactive.function.client.WebClient;
|
||||
import com.baeldung.reactive.model.Foo;
|
||||
|
||||
@SpringBootApplication
|
||||
public class Spring5ReactiveTestApplication {
|
||||
public class SpringReactiveTestApplication {
|
||||
|
||||
@Bean
|
||||
public WebClient client() {
|
||||
@ -29,7 +29,7 @@ public class Spring5ReactiveTestApplication {
|
||||
//
|
||||
|
||||
public static void main(String[] args) {
|
||||
SpringApplication.run(Spring5ReactiveTestApplication.class, args);
|
||||
SpringApplication.run(SpringReactiveTestApplication.class, args);
|
||||
}
|
||||
|
||||
}
|
@ -10,8 +10,8 @@ import static org.mockito.Mockito.when;
|
||||
import java.net.URI;
|
||||
|
||||
import org.eclipse.jetty.client.api.Request;
|
||||
import org.eclipse.jetty.util.ssl.SslContextFactory;
|
||||
import org.junit.jupiter.api.BeforeEach;
|
||||
import org.junit.jupiter.api.Disabled;
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.springframework.http.client.reactive.JettyClientHttpConnector;
|
||||
@ -73,9 +73,9 @@ public class WebClientLoggingIntegrationTest {
|
||||
}
|
||||
|
||||
@Test
|
||||
@Disabled
|
||||
public void givenJettyHttpClient_whenEndpointIsConsumed_thenRequestAndResponseBodyLogged() {
|
||||
SslContextFactory.Client sslContextFactory = new SslContextFactory.Client();
|
||||
org.eclipse.jetty.client.HttpClient httpClient = new org.eclipse.jetty.client.HttpClient(sslContextFactory) {
|
||||
org.eclipse.jetty.client.HttpClient httpClient = new org.eclipse.jetty.client.HttpClient(){
|
||||
@Override
|
||||
public Request newRequest(URI uri) {
|
||||
Request request = super.newRequest(uri);
|
||||
@ -91,8 +91,7 @@ public class WebClientLoggingIntegrationTest {
|
||||
.uri(sampleUrl)
|
||||
.body(BodyInserters.fromObject(post))
|
||||
.retrieve()
|
||||
.bodyToMono(String.class)
|
||||
.block();
|
||||
.bodyToMono(String.class);
|
||||
|
||||
verify(jettyAppender).doAppend(argThat(argument -> (((LoggingEvent) argument).getFormattedMessage()).contains(sampleResponseBody)));
|
||||
}
|
||||
@ -103,14 +102,16 @@ public class WebClientLoggingIntegrationTest {
|
||||
reactor.netty.http.client.HttpClient httpClient = HttpClient
|
||||
.create()
|
||||
.wiretap(true);
|
||||
|
||||
WebClient
|
||||
.builder()
|
||||
.clientConnector(new ReactorClientHttpConnector(httpClient))
|
||||
.build()
|
||||
.post()
|
||||
.uri(sampleUrl)
|
||||
.body(BodyInserters.fromObject(post))
|
||||
.exchange()
|
||||
.body(BodyInserters.fromValue(post))
|
||||
.retrieve()
|
||||
.bodyToMono(String.class)
|
||||
.block();
|
||||
|
||||
verify(nettyAppender).doAppend(argThat(argument -> (((LoggingEvent) argument).getFormattedMessage()).contains("00000300")));
|
||||
@ -126,8 +127,9 @@ public class WebClientLoggingIntegrationTest {
|
||||
.build()
|
||||
.post()
|
||||
.uri(sampleUrl)
|
||||
.body(BodyInserters.fromObject(post))
|
||||
.exchange()
|
||||
.body(BodyInserters.fromValue(post))
|
||||
.retrieve()
|
||||
.bodyToMono(String.class)
|
||||
.block();
|
||||
|
||||
verify(nettyAppender).doAppend(argThat(argument -> (((LoggingEvent) argument).getFormattedMessage()).contains(sampleResponseBody)));
|
||||
@ -141,9 +143,10 @@ public class WebClientLoggingIntegrationTest {
|
||||
.build()
|
||||
.post()
|
||||
.uri(sampleUrl)
|
||||
.body(BodyInserters.fromObject(post))
|
||||
.exchange()
|
||||
.block();
|
||||
.body(BodyInserters.fromValue(post))
|
||||
.retrieve()
|
||||
.bodyToMono(String.class)
|
||||
.block();
|
||||
|
||||
verify(mockAppender, atLeast(1)).doAppend(argThat(argument -> (((LoggingEvent) argument).getFormattedMessage()).contains(sampleUrl)));
|
||||
}
|
||||
|
@ -37,7 +37,7 @@ public class LogFilters {
|
||||
if (log.isDebugEnabled()) {
|
||||
StringBuilder sb = new StringBuilder("Response: \n")
|
||||
.append("Status: ")
|
||||
.append(clientResponse.rawStatusCode());
|
||||
.append(clientResponse.statusCode());
|
||||
clientResponse
|
||||
.headers()
|
||||
.asHttpHeaders()
|
||||
|
@ -7,16 +7,11 @@ import org.junit.jupiter.api.BeforeEach;
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.junit.jupiter.api.extension.ExtendWith;
|
||||
import org.mockito.Mock;
|
||||
import org.mockito.exceptions.base.MockitoException;
|
||||
import org.mockito.junit.MockitoJUnitRunner;
|
||||
import org.mockito.junit.jupiter.MockitoExtension;
|
||||
import org.springframework.web.reactive.function.client.WebClient;
|
||||
import reactor.core.publisher.Mono;
|
||||
import reactor.test.StepVerifier;
|
||||
|
||||
import static org.mockito.ArgumentMatchers.any;
|
||||
import static org.mockito.ArgumentMatchers.eq;
|
||||
import static org.mockito.Mockito.mock;
|
||||
import static org.mockito.Mockito.when;
|
||||
|
||||
@ExtendWith(MockitoExtension.class)
|
||||
|
@ -3,6 +3,7 @@ package com.baeldung.reactive.service;
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.springframework.core.io.Resource;
|
||||
import org.springframework.http.HttpStatus;
|
||||
import org.springframework.http.HttpStatusCode;
|
||||
import org.springframework.web.multipart.MultipartFile;
|
||||
import org.springframework.web.reactive.function.client.ClientResponse;
|
||||
import org.springframework.web.reactive.function.client.WebClient;
|
||||
@ -28,8 +29,8 @@ class ReactiveUploadServiceUnitTest {
|
||||
void givenAPdf_whenUploadingWithWebClient_thenOK() {
|
||||
final Resource file = mock(Resource.class);
|
||||
|
||||
final Mono<HttpStatus> result = tested.uploadPdf(file);
|
||||
final HttpStatus status = result.block();
|
||||
final Mono<HttpStatusCode> result = tested.uploadPdf(file);
|
||||
final HttpStatusCode status = result.block();
|
||||
|
||||
assertThat(status).isEqualTo(HttpStatus.OK);
|
||||
}
|
||||
@ -40,8 +41,8 @@ class ReactiveUploadServiceUnitTest {
|
||||
final MultipartFile multipartFile = mock(MultipartFile.class);
|
||||
when(multipartFile.getResource()).thenReturn(file);
|
||||
|
||||
final Mono<HttpStatus> result = tested.uploadMultipart(multipartFile);
|
||||
final HttpStatus status = result.block();
|
||||
final Mono<HttpStatusCode> result = tested.uploadMultipart(multipartFile);
|
||||
final HttpStatusCode status = result.block();
|
||||
|
||||
assertThat(status).isEqualTo(HttpStatus.OK);
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user