From 6130be09e0771254fec24d8986573c028d22d608 Mon Sep 17 00:00:00 2001 From: Roman Strobl Date: Mon, 11 May 2026 16:49:15 +0200 Subject: [PATCH 01/20] Fix #451: Support Spring Boot 4.0.x --- pom.xml | 2 +- rest-client-base/pom.xml | 8 +++++ .../rest/client/base/DefaultRestClient.java | 33 +++++++++---------- .../client/base/DefaultRestClientTest.java | 14 ++++---- rest-model-base/pom.xml | 5 +++ .../model/base/response/ObjectResponse.java | 2 ++ 6 files changed, 38 insertions(+), 26 deletions(-) diff --git a/pom.xml b/pom.xml index 4236b05a..919853e5 100644 --- a/pom.xml +++ b/pom.xml @@ -62,7 +62,7 @@ 3.6.2 - 3.5.14 + 4.0.6 7.7.0 diff --git a/rest-client-base/pom.xml b/rest-client-base/pom.xml index 73140760..a019acd0 100644 --- a/rest-client-base/pom.xml +++ b/rest-client-base/pom.xml @@ -49,6 +49,14 @@ org.slf4j slf4j-api + + com.fasterxml.jackson.core + jackson-databind + + + io.netty + netty-transport-classes-epoll + diff --git a/rest-client-base/src/main/java/com/wultra/core/rest/client/base/DefaultRestClient.java b/rest-client-base/src/main/java/com/wultra/core/rest/client/base/DefaultRestClient.java index 7bccdb7e..8abc7360 100644 --- a/rest-client-base/src/main/java/com/wultra/core/rest/client/base/DefaultRestClient.java +++ b/rest-client-base/src/main/java/com/wultra/core/rest/client/base/DefaultRestClient.java @@ -33,6 +33,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.core.ParameterizedTypeReference; +import org.springframework.core.ResolvableType; import org.springframework.core.io.buffer.DataBuffer; import org.springframework.core.io.buffer.DataBufferLimitException; import org.springframework.http.*; @@ -304,7 +305,7 @@ public ResponseEntity get(String path, MultiValueMap quer return buildUri(webClient.get(), path, queryParams) .headers(h -> { if (headers != null) { - h.addAll(headers); + headers.forEach(h::addAll); } }) .exchangeToMono(rs -> handleResponse(rs, responseType)) @@ -329,7 +330,7 @@ public void getNonBlocking(String path, MultiValueMap queryP buildUri(webClient.get(), path, queryParams) .headers(h -> { if (headers != null) { - h.addAll(headers); + headers.forEach(h::addAll); } }) .accept(config.getAcceptType()) @@ -373,7 +374,7 @@ public ResponseEntity post(String path, Object request, MultiValueMap { if (headers != null) { - h.addAll(headers); + headers.forEach(h::addAll); } }) .contentType(resolveContentType(config, headers)) @@ -408,7 +409,7 @@ public void postNonBlocking(String path, Object request, MultiValueMap { if (headers != null) { - h.addAll(headers); + headers.forEach(h::addAll); } }) .contentType(resolveContentType(config, headers)) @@ -454,7 +455,7 @@ public ResponseEntity put(String path, Object request, MultiValueMap { if (headers != null) { - h.addAll(headers); + headers.forEach(h::addAll); } }) .contentType(resolveContentType(config, headers)) @@ -482,7 +483,7 @@ public void putNonBlocking(String path, Object request, MultiValueMap { if (headers != null) { - h.addAll(headers); + headers.forEach(h::addAll); } }) .contentType(resolveContentType(config, headers)) @@ -528,7 +529,7 @@ public ResponseEntity delete(String path, MultiValueMap q return buildUri(webClient.delete(), path, queryParams) .headers(h -> { if (headers != null) { - h.addAll(headers); + headers.forEach(h::addAll); } }) .exchangeToMono(rs -> handleResponse(rs, responseType)) @@ -553,7 +554,7 @@ public void deleteNonBlocking(String path, MultiValueMap que buildUri(webClient.delete(), path, queryParams) .headers(h -> { if (headers != null) { - h.addAll(headers); + headers.forEach(h::addAll); } }) .accept(config.getAcceptType()) @@ -596,7 +597,7 @@ public ResponseEntity patch(String path, Object request, MultiValueMap { if (headers != null) { - h.addAll(headers); + headers.forEach(h::addAll); } }) .contentType(resolveContentType(config, headers)) @@ -624,7 +625,7 @@ public void patchNonBlocking(String path, Object request, MultiValueMap { if (headers != null) { - h.addAll(headers); + headers.forEach(h::addAll); } }) .contentType(resolveContentType(config, headers)) @@ -670,7 +671,7 @@ public ResponseEntity head(String path, MultiValueMap que return buildUri(webClient.head(), path, queryParams) .headers(h -> { if (headers != null) { - h.addAll(headers); + headers.forEach(h::addAll); } }) .exchangeToMono(rs -> handleResponse(rs, responseType)) @@ -696,7 +697,7 @@ public void headNonBlocking(String path, MultiValueMap query buildUri(webClient.head(), path, queryParams) .headers(h -> { if (headers != null) { - h.addAll(headers); + headers.forEach(h::addAll); } }) .accept(config.getAcceptType()) @@ -738,12 +739,8 @@ public ObjectResponse headObject(String path, MultiValueMap ParameterizedTypeReference> getTypeReference(Class responseType) { - return new ParameterizedTypeReference<>() { - @Override - public Type getType() { - return TypeFactory.defaultInstance().constructParametricType(ObjectResponse.class, responseType); - } - }; + final Type type = ResolvableType.forClassWithGenerics(ObjectResponse.class, responseType).getType(); + return ParameterizedTypeReference.forType(type); } /** diff --git a/rest-client-base/src/test/java/com/wultra/core/rest/client/base/DefaultRestClientTest.java b/rest-client-base/src/test/java/com/wultra/core/rest/client/base/DefaultRestClientTest.java index b1035f3d..05a76249 100644 --- a/rest-client-base/src/test/java/com/wultra/core/rest/client/base/DefaultRestClientTest.java +++ b/rest-client-base/src/test/java/com/wultra/core/rest/client/base/DefaultRestClientTest.java @@ -706,8 +706,8 @@ void testPostWithMultipartData() throws RestClientException { MultipartBodyBuilder bodyBuilder = new MultipartBodyBuilder(); bodyBuilder.part("request", testRequest); - HttpHeaders headers = new HttpHeaders(); - headers.setContentType(MediaType.MULTIPART_FORM_DATA); + final MultiValueMap headers = new LinkedMultiValueMap<>(); + headers.add("Content-Type", MediaType.MULTIPART_FORM_DATA_VALUE); final ResponseEntity> responseEntity = restClient.post("/multipart-request-response", bodyBuilder.build(), null, headers, new ParameterizedTypeReference<>(){}); @@ -720,8 +720,8 @@ void testPostWithMultipartData() throws RestClientException { @Test void testPostFormData() throws Exception { - final HttpHeaders headers = new HttpHeaders(); - headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED); + final MultiValueMap headers = new LinkedMultiValueMap<>(); + headers.add("Content-Type", MediaType.APPLICATION_FORM_URLENCODED_VALUE); final MultiValueMap map = new LinkedMultiValueMap<>(); map.add("grant_type", "authorization_code"); @@ -742,8 +742,8 @@ void testPostFormData() throws Exception { void testPostOctetStream() throws Exception { final byte[] request = {1, 2}; - final HttpHeaders headers = new HttpHeaders(); - headers.setContentType(MediaType.APPLICATION_OCTET_STREAM); + final MultiValueMap headers = new LinkedMultiValueMap<>(); + headers.add("Content-Type", MediaType.APPLICATION_OCTET_STREAM_VALUE); final ResponseEntity> responseEntity = restClient.post("/octet-stream", request, null, headers, new ParameterizedTypeReference<>(){}); @@ -788,7 +788,7 @@ void testDefaultHttpHeaders() throws RestClientException { final ResponseEntity> responseEntity = restClient.post("/request-headers-response", null, new ParameterizedTypeReference<>(){}); - assertTrue(responseEntity.getHeaders().containsKey(headerName)); + assertTrue(responseEntity.getHeaders().containsHeader(headerName)); assertEquals(headerVaue, responseEntity.getHeaders().getFirst(headerName)); } diff --git a/rest-model-base/pom.xml b/rest-model-base/pom.xml index 21467c23..bf395b6e 100644 --- a/rest-model-base/pom.xml +++ b/rest-model-base/pom.xml @@ -20,6 +20,11 @@ jakarta.validation-api compile + + com.fasterxml.jackson.core + jackson-databind + compile + diff --git a/rest-model-base/src/main/java/com/wultra/core/rest/model/base/response/ObjectResponse.java b/rest-model-base/src/main/java/com/wultra/core/rest/model/base/response/ObjectResponse.java index 1be9af64..c4b62b98 100644 --- a/rest-model-base/src/main/java/com/wultra/core/rest/model/base/response/ObjectResponse.java +++ b/rest-model-base/src/main/java/com/wultra/core/rest/model/base/response/ObjectResponse.java @@ -16,6 +16,7 @@ package com.wultra.core.rest.model.base.response; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; import jakarta.validation.Valid; import jakarta.validation.constraints.NotNull; import lombok.EqualsAndHashCode; @@ -30,6 +31,7 @@ */ @ToString(callSuper = true) @EqualsAndHashCode(callSuper = true) +@JsonPropertyOrder({"status", "responseObject"}) public class ObjectResponse extends Response { @Valid From ea582db77d96625acc3212cf4e20d321bcfbfe55 Mon Sep 17 00:00:00 2001 From: Roman Strobl Date: Mon, 11 May 2026 21:23:42 +0200 Subject: [PATCH 02/20] Migrate to Jackson 3 --- audit-base/pom.xml | 6 +- .../wultra/core/audit/base/util/JsonUtil.java | 26 ++++---- http-common/pom.xml | 2 +- .../http/common/headers/UserAgentTest.java | 8 +-- rest-client-base/pom.xml | 2 +- .../rest/client/base/DefaultRestClient.java | 65 +++++++++++-------- .../client/base/RestClientConfiguration.java | 4 +- .../client/base/DefaultRestClientTest.java | 6 +- rest-model-base/pom.xml | 2 +- 9 files changed, 64 insertions(+), 57 deletions(-) diff --git a/audit-base/pom.xml b/audit-base/pom.xml index ecdbe526..9ca8fcc5 100644 --- a/audit-base/pom.xml +++ b/audit-base/pom.xml @@ -20,13 +20,9 @@ spring-boot-starter-jdbc - com.fasterxml.jackson.core + tools.jackson.core jackson-databind - - com.fasterxml.jackson.datatype - jackson-datatype-jsr310 - jakarta.annotation jakarta.annotation-api diff --git a/audit-base/src/main/java/com/wultra/core/audit/base/util/JsonUtil.java b/audit-base/src/main/java/com/wultra/core/audit/base/util/JsonUtil.java index fede336f..e335c96b 100644 --- a/audit-base/src/main/java/com/wultra/core/audit/base/util/JsonUtil.java +++ b/audit-base/src/main/java/com/wultra/core/audit/base/util/JsonUtil.java @@ -16,12 +16,12 @@ package com.wultra.core.audit.base.util; import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.SerializationFeature; -import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import tools.jackson.core.JacksonException; +import tools.jackson.databind.ObjectMapper; +import tools.jackson.databind.SerializationFeature; +import tools.jackson.databind.json.JsonMapper; import java.util.Map; @@ -34,14 +34,12 @@ public class JsonUtil { private static final Logger logger = LoggerFactory.getLogger(JsonUtil.class); - private final ObjectMapper objectMapper = new ObjectMapper(); - - { - objectMapper.setSerializationInclusion(JsonInclude.Include.NON_EMPTY); - objectMapper.registerModule(new JavaTimeModule()); - objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false); - objectMapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false); - } + private final ObjectMapper objectMapper = JsonMapper.builder() + .changeDefaultPropertyInclusion(incl -> incl + .withValueInclusion(JsonInclude.Include.NON_EMPTY) + .withContentInclusion(JsonInclude.Include.NON_EMPTY)) + .disable(SerializationFeature.FAIL_ON_EMPTY_BEANS) + .build(); /** * Serialize an object into JSON. @@ -51,7 +49,7 @@ public class JsonUtil { public String serializeObject(Object o) { try { return objectMapper.writeValueAsString(o); - } catch (JsonProcessingException ex) { + } catch (JacksonException ex) { logger.warn(ex.getMessage(), ex); } return ""; @@ -65,7 +63,7 @@ public String serializeObject(Object o) { public String serializeMap(Map map) { try { return objectMapper.writeValueAsString(map); - } catch (JsonProcessingException ex) { + } catch (JacksonException ex) { logger.warn(ex.getMessage(), ex); } return "{}"; diff --git a/http-common/pom.xml b/http-common/pom.xml index 1ca8675c..6485eae6 100644 --- a/http-common/pom.xml +++ b/http-common/pom.xml @@ -31,7 +31,7 @@ test - com.fasterxml.jackson.core + tools.jackson.core jackson-databind test diff --git a/http-common/src/test/java/com/wultra/core/http/common/headers/UserAgentTest.java b/http-common/src/test/java/com/wultra/core/http/common/headers/UserAgentTest.java index 37962542..8136c2a3 100644 --- a/http-common/src/test/java/com/wultra/core/http/common/headers/UserAgentTest.java +++ b/http-common/src/test/java/com/wultra/core/http/common/headers/UserAgentTest.java @@ -15,11 +15,11 @@ */ package com.wultra.core.http.common.headers; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.ObjectMapper; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; +import tools.jackson.core.JacksonException; +import tools.jackson.databind.ObjectMapper; import java.util.stream.Stream; @@ -44,7 +44,7 @@ void testParse(final String userAgent, final UserAgent.Device expectedDevice) { assertEquals(expectedDevice, deviceOptional.get()); } - private static Stream provideUserAgents() throws JsonProcessingException { + private static Stream provideUserAgents() throws JacksonException { return Stream.of( Arguments.of("PowerAuthNetworking/1.1.7 (en; cellular) com.wultra.app.Mobile-Token.wultra_test/2.0.0 (Apple; iOS/16.6.1; iphone12,3)", readDevice(""" { @@ -127,7 +127,7 @@ private static Stream provideUserAgents() throws JsonProcessingExcept ); } - private static UserAgent.Device readDevice(final String json) throws JsonProcessingException { + private static UserAgent.Device readDevice(final String json) throws JacksonException { return new ObjectMapper().readValue(json, UserAgent.Device.class); } diff --git a/rest-client-base/pom.xml b/rest-client-base/pom.xml index a019acd0..ff11223a 100644 --- a/rest-client-base/pom.xml +++ b/rest-client-base/pom.xml @@ -50,7 +50,7 @@ slf4j-api - com.fasterxml.jackson.core + tools.jackson.core jackson-databind diff --git a/rest-client-base/src/main/java/com/wultra/core/rest/client/base/DefaultRestClient.java b/rest-client-base/src/main/java/com/wultra/core/rest/client/base/DefaultRestClient.java index 8abc7360..d05116bc 100644 --- a/rest-client-base/src/main/java/com/wultra/core/rest/client/base/DefaultRestClient.java +++ b/rest-client-base/src/main/java/com/wultra/core/rest/client/base/DefaultRestClient.java @@ -15,9 +15,6 @@ */ package com.wultra.core.rest.client.base; -import com.fasterxml.jackson.databind.Module; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.type.TypeFactory; import com.wultra.core.rest.client.base.util.SslUtils; import com.wultra.core.rest.model.base.request.ObjectRequest; import com.wultra.core.rest.model.base.response.ErrorResponse; @@ -41,7 +38,10 @@ import org.springframework.http.codec.ClientCodecConfigurer; import org.springframework.http.codec.json.Jackson2JsonDecoder; import org.springframework.http.codec.json.Jackson2JsonEncoder; +import org.springframework.http.codec.json.JacksonJsonDecoder; +import org.springframework.http.codec.json.JacksonJsonEncoder; import org.springframework.util.LinkedMultiValueMap; +import org.springframework.util.MimeType; import org.springframework.util.MultiValueMap; import org.springframework.web.reactive.function.BodyInserters; import org.springframework.web.reactive.function.client.*; @@ -51,6 +51,10 @@ import reactor.netty.tcp.SslProvider; import reactor.netty.transport.ProxyProvider; import reactor.netty.transport.logging.AdvancedByteBufFormat; +import tools.jackson.databind.JacksonModule; +import tools.jackson.databind.ObjectMapper; +import tools.jackson.databind.json.JsonMapper; +import tools.jackson.databind.type.TypeFactory; import java.io.IOException; import java.lang.reflect.Type; @@ -78,7 +82,7 @@ public class DefaultRestClient implements RestClient { private WebClient webClient; private final RestClientConfiguration config; - private final Collection modules; + private final Collection modules; /** * Construct default REST client without any additional configuration. @@ -99,7 +103,7 @@ public DefaultRestClient(String baseUrl) throws RestClientException { * @param modules jackson modules * @throws RestClientException Thrown in case client initialization fails. */ - public DefaultRestClient(final RestClientConfiguration config, final Module... modules) throws RestClientException { + public DefaultRestClient(final RestClientConfiguration config, final JacksonModule... modules) throws RestClientException { // Use WebClient configuration from the config constructor parameter this.config = config; this.modules = modules == null ? Collections.emptyList() : Arrays.asList(modules); @@ -173,13 +177,13 @@ private void initializeWebClient() throws RestClientException { }); } - final Optional objectMapperOptional = createObjectMapper(config, modules); + final Optional objectMapperOptional = createObjectMapper(config, modules); final ExchangeStrategies exchangeStrategies = ExchangeStrategies.builder() .codecs(configurer -> { ClientCodecConfigurer.ClientDefaultCodecs defaultCodecs = configurer.defaultCodecs(); - objectMapperOptional.ifPresent(objectMapper -> { - defaultCodecs.jackson2JsonEncoder(new Jackson2JsonEncoder(objectMapper, MediaType.APPLICATION_JSON)); - defaultCodecs.jackson2JsonDecoder(new Jackson2JsonDecoder(objectMapper, MediaType.APPLICATION_JSON)); + objectMapperOptional.ifPresent(mapper -> { + defaultCodecs.jacksonJsonEncoder(new JacksonJsonEncoder(mapper, MediaType.APPLICATION_JSON)); + defaultCodecs.jacksonJsonDecoder(new JacksonJsonDecoder(mapper, MediaType.APPLICATION_JSON)); }); defaultCodecs.maxInMemorySize(config.getMaxInMemorySize()); }) @@ -271,21 +275,34 @@ private static HttpClient createHttpClient(final RestClientConfiguration config) return HttpClient.create(providerBuilder.build()); } - private static Optional createObjectMapper(final RestClientConfiguration config, Collection modules) { + private static Optional createObjectMapper(final RestClientConfiguration config, Collection modules) { final RestClientConfiguration.JacksonConfiguration jacksonConfiguration = config.getJacksonConfiguration(); if (jacksonConfiguration == null && modules.isEmpty()) { return Optional.empty(); } logger.debug("Configuring object mapper"); - final ObjectMapper objectMapper = new ObjectMapper(); + JsonMapper.Builder builder = JsonMapper.builder(); + builder.addModules(modules); if (jacksonConfiguration != null) { - jacksonConfiguration.getDeserialization().forEach(objectMapper::configure); - jacksonConfiguration.getSerialization().forEach(objectMapper::configure); + jacksonConfiguration.getDeserialization() + .forEach((feature, state) -> { + if (state) { + builder.enable(feature); + } else { + builder.disable(feature); + } + }); + jacksonConfiguration.getSerialization() + .forEach((feature, state) -> { + if (state) { + builder.enable(feature); + } else { + builder.disable(feature); + } + }); } - objectMapper.registerModules(modules); - - return Optional.of(objectMapper); + return Optional.of(builder.build()); } private static void validateConfiguration(final RestClientConfiguration config) throws RestClientException { @@ -765,15 +782,11 @@ private Mono> handleResponse(ClientResponse response, Para // Try to parse ErrorResponse in case expected response type is ObjectResponse Class clazz = TypeFactory.rawClass(responseType.getType()); if (clazz.isAssignableFrom(ObjectResponse.class)) { - try { - // Use an ObjectMapper to deserialize the error response - ObjectMapper objectMapper = new ObjectMapper(); - ErrorResponse errorResponse = objectMapper.readValue(rawResponse, ErrorResponse.class); - if (errorResponse != null) { - return Mono.error(new RestClientException("HTTP error occurred: " + response.statusCode(), response.statusCode(), rawResponse, rawResponseHeaders, errorResponse)); - } - } catch (IOException ex) { - // Exception is handled silently, ErrorResponse is not available, use a regular error with raw response + // Use an ObjectMapper to deserialize the error response + ObjectMapper objectMapper = new ObjectMapper(); + ErrorResponse errorResponse = objectMapper.readValue(rawResponse, ErrorResponse.class); + if (errorResponse != null) { + return Mono.error(new RestClientException("HTTP error occurred: " + response.statusCode(), response.statusCode(), rawResponse, rawResponseHeaders, errorResponse)); } } return Mono.error(new RestClientException("HTTP error occurred: " + response.statusCode(), response.statusCode(), rawResponse, rawResponseHeaders)); @@ -872,7 +885,7 @@ public static class Builder { private final RestClientConfiguration config; - private final Collection modules; + private final Collection modules; /** * Construct new builder with given base URL. diff --git a/rest-client-base/src/main/java/com/wultra/core/rest/client/base/RestClientConfiguration.java b/rest-client-base/src/main/java/com/wultra/core/rest/client/base/RestClientConfiguration.java index 8e941d07..fe49a229 100644 --- a/rest-client-base/src/main/java/com/wultra/core/rest/client/base/RestClientConfiguration.java +++ b/rest-client-base/src/main/java/com/wultra/core/rest/client/base/RestClientConfiguration.java @@ -15,14 +15,14 @@ */ package com.wultra.core.rest.client.base; -import com.fasterxml.jackson.databind.DeserializationFeature; -import com.fasterxml.jackson.databind.SerializationFeature; import lombok.Getter; import lombok.Setter; import org.springframework.http.HttpHeaders; import org.springframework.http.MediaType; import org.springframework.lang.Nullable; import org.springframework.web.reactive.function.client.ExchangeFilterFunction; +import tools.jackson.databind.DeserializationFeature; +import tools.jackson.databind.SerializationFeature; import java.time.Duration; import java.util.Arrays; diff --git a/rest-client-base/src/test/java/com/wultra/core/rest/client/base/DefaultRestClientTest.java b/rest-client-base/src/test/java/com/wultra/core/rest/client/base/DefaultRestClientTest.java index 05a76249..88eac692 100644 --- a/rest-client-base/src/test/java/com/wultra/core/rest/client/base/DefaultRestClientTest.java +++ b/rest-client-base/src/test/java/com/wultra/core/rest/client/base/DefaultRestClientTest.java @@ -18,8 +18,6 @@ import ch.qos.logback.classic.Logger; import ch.qos.logback.classic.spi.ILoggingEvent; import ch.qos.logback.core.read.ListAppender; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.ObjectMapper; import com.wultra.core.rest.client.base.model.TestRequest; import com.wultra.core.rest.client.base.model.TestResponse; import com.wultra.core.rest.model.base.request.ObjectRequest; @@ -46,6 +44,8 @@ import org.springframework.util.MultiValueMap; import org.springframework.util.ResourceUtils; import reactor.core.publisher.Flux; +import tools.jackson.core.JacksonException; +import tools.jackson.databind.ObjectMapper; import java.io.File; import java.io.FileInputStream; @@ -683,7 +683,7 @@ void testDeleteWithFullUrl() throws RestClientException { } @Test - void testPostWithDataBuffer() throws RestClientException, JsonProcessingException { + void testPostWithDataBuffer() throws RestClientException, JacksonException { String requestData = String.valueOf(System.currentTimeMillis()); ObjectRequest request = new ObjectRequest<>(new TestRequest(requestData)); ObjectMapper objectMapper = new ObjectMapper(); diff --git a/rest-model-base/pom.xml b/rest-model-base/pom.xml index bf395b6e..718a3268 100644 --- a/rest-model-base/pom.xml +++ b/rest-model-base/pom.xml @@ -21,7 +21,7 @@ compile - com.fasterxml.jackson.core + tools.jackson.core jackson-databind compile From 4bf3659403352d1776dec9011151c38be272b5bd Mon Sep 17 00:00:00 2001 From: Roman Strobl Date: Tue, 12 May 2026 19:25:34 +0200 Subject: [PATCH 03/20] Remove content inclusion suppression --- .../main/java/com/wultra/core/audit/base/util/JsonUtil.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/audit-base/src/main/java/com/wultra/core/audit/base/util/JsonUtil.java b/audit-base/src/main/java/com/wultra/core/audit/base/util/JsonUtil.java index e335c96b..bdc3a7c5 100644 --- a/audit-base/src/main/java/com/wultra/core/audit/base/util/JsonUtil.java +++ b/audit-base/src/main/java/com/wultra/core/audit/base/util/JsonUtil.java @@ -36,8 +36,7 @@ public class JsonUtil { private final ObjectMapper objectMapper = JsonMapper.builder() .changeDefaultPropertyInclusion(incl -> incl - .withValueInclusion(JsonInclude.Include.NON_EMPTY) - .withContentInclusion(JsonInclude.Include.NON_EMPTY)) + .withValueInclusion(JsonInclude.Include.NON_EMPTY)) .disable(SerializationFeature.FAIL_ON_EMPTY_BEANS) .build(); From ff4fa4f834e897251237836eeb5ba2292ed0b1d2 Mon Sep 17 00:00:00 2001 From: Roman Strobl Date: Wed, 13 May 2026 10:33:02 +0200 Subject: [PATCH 04/20] Fix imports --- .../com/wultra/core/rest/client/base/DefaultRestClient.java | 3 --- 1 file changed, 3 deletions(-) diff --git a/rest-client-base/src/main/java/com/wultra/core/rest/client/base/DefaultRestClient.java b/rest-client-base/src/main/java/com/wultra/core/rest/client/base/DefaultRestClient.java index d05116bc..57a3ce30 100644 --- a/rest-client-base/src/main/java/com/wultra/core/rest/client/base/DefaultRestClient.java +++ b/rest-client-base/src/main/java/com/wultra/core/rest/client/base/DefaultRestClient.java @@ -36,12 +36,9 @@ import org.springframework.http.*; import org.springframework.http.client.reactive.ReactorClientHttpConnector; import org.springframework.http.codec.ClientCodecConfigurer; -import org.springframework.http.codec.json.Jackson2JsonDecoder; -import org.springframework.http.codec.json.Jackson2JsonEncoder; import org.springframework.http.codec.json.JacksonJsonDecoder; import org.springframework.http.codec.json.JacksonJsonEncoder; import org.springframework.util.LinkedMultiValueMap; -import org.springframework.util.MimeType; import org.springframework.util.MultiValueMap; import org.springframework.web.reactive.function.BodyInserters; import org.springframework.web.reactive.function.client.*; From bcf9031eafe5ce073b8c9eef7e2b853f7fef34f4 Mon Sep 17 00:00:00 2001 From: Roman Strobl Date: Wed, 13 May 2026 10:35:09 +0200 Subject: [PATCH 05/20] Add handling for DatabindException --- .../core/rest/client/base/DefaultRestClient.java | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/rest-client-base/src/main/java/com/wultra/core/rest/client/base/DefaultRestClient.java b/rest-client-base/src/main/java/com/wultra/core/rest/client/base/DefaultRestClient.java index 57a3ce30..fe4ee97c 100644 --- a/rest-client-base/src/main/java/com/wultra/core/rest/client/base/DefaultRestClient.java +++ b/rest-client-base/src/main/java/com/wultra/core/rest/client/base/DefaultRestClient.java @@ -48,6 +48,7 @@ import reactor.netty.tcp.SslProvider; import reactor.netty.transport.ProxyProvider; import reactor.netty.transport.logging.AdvancedByteBufFormat; +import tools.jackson.databind.DatabindException; import tools.jackson.databind.JacksonModule; import tools.jackson.databind.ObjectMapper; import tools.jackson.databind.json.JsonMapper; @@ -779,11 +780,15 @@ private Mono> handleResponse(ClientResponse response, Para // Try to parse ErrorResponse in case expected response type is ObjectResponse Class clazz = TypeFactory.rawClass(responseType.getType()); if (clazz.isAssignableFrom(ObjectResponse.class)) { - // Use an ObjectMapper to deserialize the error response - ObjectMapper objectMapper = new ObjectMapper(); - ErrorResponse errorResponse = objectMapper.readValue(rawResponse, ErrorResponse.class); - if (errorResponse != null) { - return Mono.error(new RestClientException("HTTP error occurred: " + response.statusCode(), response.statusCode(), rawResponse, rawResponseHeaders, errorResponse)); + try { + // Use an ObjectMapper to deserialize the error response + ObjectMapper objectMapper = new ObjectMapper(); + ErrorResponse errorResponse = objectMapper.readValue(rawResponse, ErrorResponse.class); + if (errorResponse != null) { + return Mono.error(new RestClientException("HTTP error occurred: " + response.statusCode(), response.statusCode(), rawResponse, rawResponseHeaders, errorResponse)); + } + } catch (DatabindException e) { + // Exception is handled silently, ErrorResponse is not available, use a regular error with raw response } } return Mono.error(new RestClientException("HTTP error occurred: " + response.statusCode(), response.statusCode(), rawResponse, rawResponseHeaders)); From b2df10022a80126751baca5f1ec05b6c68718345 Mon Sep 17 00:00:00 2001 From: Roman Strobl Date: Wed, 13 May 2026 10:37:04 +0200 Subject: [PATCH 06/20] Remove default scope --- rest-model-base/pom.xml | 1 - 1 file changed, 1 deletion(-) diff --git a/rest-model-base/pom.xml b/rest-model-base/pom.xml index 718a3268..96c18ed8 100644 --- a/rest-model-base/pom.xml +++ b/rest-model-base/pom.xml @@ -23,7 +23,6 @@ tools.jackson.core jackson-databind - compile From c25438469945486b3075b7d6101716b9e260bacb Mon Sep 17 00:00:00 2001 From: Roman Strobl Date: Wed, 13 May 2026 10:39:59 +0200 Subject: [PATCH 07/20] Update dependencies --- rest-model-base/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rest-model-base/pom.xml b/rest-model-base/pom.xml index 96c18ed8..266f945d 100644 --- a/rest-model-base/pom.xml +++ b/rest-model-base/pom.xml @@ -21,7 +21,7 @@ compile - tools.jackson.core + com.fasterxml.jackson.core jackson-databind From d22a7011fa08852228fd6e81df5c7ab33db48acc Mon Sep 17 00:00:00 2001 From: Roman Strobl Date: Wed, 13 May 2026 10:41:40 +0200 Subject: [PATCH 08/20] Simplify configuration --- .../rest/client/base/DefaultRestClient.java | 18 ++---------------- 1 file changed, 2 insertions(+), 16 deletions(-) diff --git a/rest-client-base/src/main/java/com/wultra/core/rest/client/base/DefaultRestClient.java b/rest-client-base/src/main/java/com/wultra/core/rest/client/base/DefaultRestClient.java index fe4ee97c..ce7d96fb 100644 --- a/rest-client-base/src/main/java/com/wultra/core/rest/client/base/DefaultRestClient.java +++ b/rest-client-base/src/main/java/com/wultra/core/rest/client/base/DefaultRestClient.java @@ -283,22 +283,8 @@ private static Optional createObjectMapper(final RestClientConfigura JsonMapper.Builder builder = JsonMapper.builder(); builder.addModules(modules); if (jacksonConfiguration != null) { - jacksonConfiguration.getDeserialization() - .forEach((feature, state) -> { - if (state) { - builder.enable(feature); - } else { - builder.disable(feature); - } - }); - jacksonConfiguration.getSerialization() - .forEach((feature, state) -> { - if (state) { - builder.enable(feature); - } else { - builder.disable(feature); - } - }); + jacksonConfiguration.getDeserialization().forEach(builder::configure); + jacksonConfiguration.getSerialization().forEach(builder::configure); } return Optional.of(builder.build()); } From f7b4c1416416cbdd6dc08210fb9a7426557bbb6d Mon Sep 17 00:00:00 2001 From: Roman Strobl Date: Wed, 13 May 2026 10:42:37 +0200 Subject: [PATCH 09/20] Use constants for content type --- .../wultra/core/rest/client/base/DefaultRestClientTest.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/rest-client-base/src/test/java/com/wultra/core/rest/client/base/DefaultRestClientTest.java b/rest-client-base/src/test/java/com/wultra/core/rest/client/base/DefaultRestClientTest.java index 88eac692..97e41f4d 100644 --- a/rest-client-base/src/test/java/com/wultra/core/rest/client/base/DefaultRestClientTest.java +++ b/rest-client-base/src/test/java/com/wultra/core/rest/client/base/DefaultRestClientTest.java @@ -707,7 +707,7 @@ void testPostWithMultipartData() throws RestClientException { bodyBuilder.part("request", testRequest); final MultiValueMap headers = new LinkedMultiValueMap<>(); - headers.add("Content-Type", MediaType.MULTIPART_FORM_DATA_VALUE); + headers.add(HttpHeaders.CONTENT_TYPE, MediaType.MULTIPART_FORM_DATA_VALUE); final ResponseEntity> responseEntity = restClient.post("/multipart-request-response", bodyBuilder.build(), null, headers, new ParameterizedTypeReference<>(){}); @@ -721,7 +721,7 @@ void testPostWithMultipartData() throws RestClientException { @Test void testPostFormData() throws Exception { final MultiValueMap headers = new LinkedMultiValueMap<>(); - headers.add("Content-Type", MediaType.APPLICATION_FORM_URLENCODED_VALUE); + headers.add(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_FORM_URLENCODED_VALUE); final MultiValueMap map = new LinkedMultiValueMap<>(); map.add("grant_type", "authorization_code"); @@ -743,7 +743,7 @@ void testPostOctetStream() throws Exception { final byte[] request = {1, 2}; final MultiValueMap headers = new LinkedMultiValueMap<>(); - headers.add("Content-Type", MediaType.APPLICATION_OCTET_STREAM_VALUE); + headers.add(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_OCTET_STREAM_VALUE); final ResponseEntity> responseEntity = restClient.post("/octet-stream", request, null, headers, new ParameterizedTypeReference<>(){}); From 9daa9b8a24ecb0100dfc27168f7a263d758a1789 Mon Sep 17 00:00:00 2001 From: Roman Strobl Date: Wed, 13 May 2026 10:43:10 +0200 Subject: [PATCH 10/20] Remove default scopes --- rest-client-base/pom.xml | 1 - rest-model-base/pom.xml | 1 - 2 files changed, 2 deletions(-) diff --git a/rest-client-base/pom.xml b/rest-client-base/pom.xml index ff11223a..0f727779 100644 --- a/rest-client-base/pom.xml +++ b/rest-client-base/pom.xml @@ -43,7 +43,6 @@ com.wultra.core rest-model-base ${project.version} - compile org.slf4j diff --git a/rest-model-base/pom.xml b/rest-model-base/pom.xml index 266f945d..4b13688d 100644 --- a/rest-model-base/pom.xml +++ b/rest-model-base/pom.xml @@ -18,7 +18,6 @@ jakarta.validation jakarta.validation-api - compile com.fasterxml.jackson.core From 32dd90a3c7d7372d521abdd981ba5f10d4e46f2f Mon Sep 17 00:00:00 2001 From: Roman Strobl Date: Wed, 13 May 2026 10:45:06 +0200 Subject: [PATCH 11/20] Use correct artifactId for Jackson annotations --- rest-model-base/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rest-model-base/pom.xml b/rest-model-base/pom.xml index 4b13688d..e925015e 100644 --- a/rest-model-base/pom.xml +++ b/rest-model-base/pom.xml @@ -21,7 +21,7 @@ com.fasterxml.jackson.core - jackson-databind + jackson-annotations From f00c31a96ec74c3cd876bfba7b0ad79d5b950b8e Mon Sep 17 00:00:00 2001 From: Roman Strobl Date: Wed, 13 May 2026 10:46:44 +0200 Subject: [PATCH 12/20] Change throws in test --- .../com/wultra/core/rest/client/base/DefaultRestClientTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rest-client-base/src/test/java/com/wultra/core/rest/client/base/DefaultRestClientTest.java b/rest-client-base/src/test/java/com/wultra/core/rest/client/base/DefaultRestClientTest.java index 97e41f4d..82d410d7 100644 --- a/rest-client-base/src/test/java/com/wultra/core/rest/client/base/DefaultRestClientTest.java +++ b/rest-client-base/src/test/java/com/wultra/core/rest/client/base/DefaultRestClientTest.java @@ -683,7 +683,7 @@ void testDeleteWithFullUrl() throws RestClientException { } @Test - void testPostWithDataBuffer() throws RestClientException, JacksonException { + void testPostWithDataBuffer() throws Exception { String requestData = String.valueOf(System.currentTimeMillis()); ObjectRequest request = new ObjectRequest<>(new TestRequest(requestData)); ObjectMapper objectMapper = new ObjectMapper(); From 9ddf132d6ce1f7343b3f05b034e6f3040e538876 Mon Sep 17 00:00:00 2001 From: Roman Strobl Date: Wed, 13 May 2026 11:17:06 +0200 Subject: [PATCH 13/20] Add Changelog.md --- Changelog.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 Changelog.md diff --git a/Changelog.md b/Changelog.md new file mode 100644 index 00000000..44d90db4 --- /dev/null +++ b/Changelog.md @@ -0,0 +1,5 @@ +# Changelog + +## 2.2.0 +- Migrated to Spring Boot 4 and Jackson 3. + From b138b5c9990064213955498ed438421c3d7bcdd0 Mon Sep 17 00:00:00 2001 From: Roman Strobl Date: Wed, 13 May 2026 12:01:33 +0200 Subject: [PATCH 14/20] Fix bug when adding modules --- .../com/wultra/core/rest/client/base/DefaultRestClient.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/rest-client-base/src/main/java/com/wultra/core/rest/client/base/DefaultRestClient.java b/rest-client-base/src/main/java/com/wultra/core/rest/client/base/DefaultRestClient.java index ce7d96fb..336667db 100644 --- a/rest-client-base/src/main/java/com/wultra/core/rest/client/base/DefaultRestClient.java +++ b/rest-client-base/src/main/java/com/wultra/core/rest/client/base/DefaultRestClient.java @@ -1094,8 +1094,8 @@ public Builder jacksonConfiguration(RestClientConfiguration.JacksonConfiguration * @param modules Jackson modules. * @return Builder. */ - public Builder modules(Collection modules) { - modules.addAll(modules); + public Builder modules(Collection modules) { + this.modules.addAll(modules); return this; } From 6323b9f1bf434f444e1784094ae364ba249d3ff9 Mon Sep 17 00:00:00 2001 From: Roman Strobl Date: Wed, 13 May 2026 12:24:34 +0200 Subject: [PATCH 15/20] Update changelog --- Changelog.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Changelog.md b/Changelog.md index 44d90db4..ba625d5a 100644 --- a/Changelog.md +++ b/Changelog.md @@ -1,5 +1,5 @@ # Changelog ## 2.2.0 -- Migrated to Spring Boot 4 and Jackson 3. +- [#451](https://github.com/wultra/java-core/issues/451) - Support Spring Boot 4.0.x Migrated to Spring Boot 4 and Jackson 3. From 972aa1797a6e97f037b341a1d11f4ad0c205cb5b Mon Sep 17 00:00:00 2001 From: Roman Strobl Date: Wed, 13 May 2026 12:25:17 +0200 Subject: [PATCH 16/20] Fix wording --- Changelog.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Changelog.md b/Changelog.md index ba625d5a..266e84bb 100644 --- a/Changelog.md +++ b/Changelog.md @@ -1,5 +1,5 @@ # Changelog ## 2.2.0 -- [#451](https://github.com/wultra/java-core/issues/451) - Support Spring Boot 4.0.x Migrated to Spring Boot 4 and Jackson 3. +- [#451](https://github.com/wultra/java-core/issues/451) - Migrated to Spring Boot 4 and Jackson 3. From 8e5803942b7943a23ad93a8d3c808ae75be85648 Mon Sep 17 00:00:00 2001 From: Roman Strobl Date: Wed, 13 May 2026 12:55:10 +0200 Subject: [PATCH 17/20] Increase timeout --- .../core/audit/base/database/DatabaseAuditWriterTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/audit-base/src/test/java/com/wultra/core/audit/base/database/DatabaseAuditWriterTest.java b/audit-base/src/test/java/com/wultra/core/audit/base/database/DatabaseAuditWriterTest.java index 36002af7..72a6f097 100644 --- a/audit-base/src/test/java/com/wultra/core/audit/base/database/DatabaseAuditWriterTest.java +++ b/audit-base/src/test/java/com/wultra/core/audit/base/database/DatabaseAuditWriterTest.java @@ -66,7 +66,7 @@ void testAuditScheduledCleanup() { assertEquals(1, countAuditLogs(jdbcTemplate)); Awaitility.await() - .atMost(Duration.ofSeconds(5)) + .atMost(Duration.ofSeconds(6)) .until(() -> countAuditLogs(jdbcTemplate) == 0); } } From e6097dd1bd272066bf5562f75619474440d421c8 Mon Sep 17 00:00:00 2001 From: Roman Strobl Date: Wed, 13 May 2026 12:56:03 +0200 Subject: [PATCH 18/20] Add logging --- .../com/wultra/core/rest/client/base/DefaultRestClient.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/rest-client-base/src/main/java/com/wultra/core/rest/client/base/DefaultRestClient.java b/rest-client-base/src/main/java/com/wultra/core/rest/client/base/DefaultRestClient.java index 336667db..a8a63787 100644 --- a/rest-client-base/src/main/java/com/wultra/core/rest/client/base/DefaultRestClient.java +++ b/rest-client-base/src/main/java/com/wultra/core/rest/client/base/DefaultRestClient.java @@ -26,6 +26,7 @@ import io.netty.handler.logging.LogLevel; import io.netty.handler.ssl.SslContext; import jdk.net.ExtendedSocketOptions; +import lombok.extern.slf4j.Slf4j; import org.reactivestreams.Publisher; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -68,10 +69,9 @@ * * @author Roman Strobl, roman.strobl@wultra.com */ +@Slf4j public class DefaultRestClient implements RestClient { - private static final Logger logger = LoggerFactory.getLogger(DefaultRestClient.class); - /** * Default max connections. * As same value as in {@link reactor.netty.tcp.TcpResources#get()} avoid default to {@code 2 * available number of processors} only. @@ -774,7 +774,7 @@ private Mono> handleResponse(ClientResponse response, Para return Mono.error(new RestClientException("HTTP error occurred: " + response.statusCode(), response.statusCode(), rawResponse, rawResponseHeaders, errorResponse)); } } catch (DatabindException e) { - // Exception is handled silently, ErrorResponse is not available, use a regular error with raw response + logger.warn("Error occurred when parsing response body", e); } } return Mono.error(new RestClientException("HTTP error occurred: " + response.statusCode(), response.statusCode(), rawResponse, rawResponseHeaders)); From 0283b6c0cf48fc4fceeae9d2a2301482b0f65ef3 Mon Sep 17 00:00:00 2001 From: Roman Strobl Date: Wed, 13 May 2026 18:22:58 +0200 Subject: [PATCH 19/20] Apply best practices from migration guide --- .../com/wultra/core/http/common/headers/UserAgentTest.java | 4 +++- .../com/wultra/core/rest/client/base/DefaultRestClient.java | 5 +---- .../wultra/core/rest/client/base/DefaultRestClientTest.java | 4 ++-- 3 files changed, 6 insertions(+), 7 deletions(-) diff --git a/http-common/src/test/java/com/wultra/core/http/common/headers/UserAgentTest.java b/http-common/src/test/java/com/wultra/core/http/common/headers/UserAgentTest.java index 8136c2a3..ee57d1b5 100644 --- a/http-common/src/test/java/com/wultra/core/http/common/headers/UserAgentTest.java +++ b/http-common/src/test/java/com/wultra/core/http/common/headers/UserAgentTest.java @@ -20,6 +20,7 @@ import org.junit.jupiter.params.provider.MethodSource; import tools.jackson.core.JacksonException; import tools.jackson.databind.ObjectMapper; +import tools.jackson.databind.json.JsonMapper; import java.util.stream.Stream; @@ -128,7 +129,8 @@ private static Stream provideUserAgents() throws JacksonException { } private static UserAgent.Device readDevice(final String json) throws JacksonException { - return new ObjectMapper().readValue(json, UserAgent.Device.class); + ObjectMapper objectMapper = JsonMapper.builder().build(); + return objectMapper.readValue(json, UserAgent.Device.class); } } diff --git a/rest-client-base/src/main/java/com/wultra/core/rest/client/base/DefaultRestClient.java b/rest-client-base/src/main/java/com/wultra/core/rest/client/base/DefaultRestClient.java index a8a63787..1e3aaca0 100644 --- a/rest-client-base/src/main/java/com/wultra/core/rest/client/base/DefaultRestClient.java +++ b/rest-client-base/src/main/java/com/wultra/core/rest/client/base/DefaultRestClient.java @@ -28,8 +28,6 @@ import jdk.net.ExtendedSocketOptions; import lombok.extern.slf4j.Slf4j; import org.reactivestreams.Publisher; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import org.springframework.core.ParameterizedTypeReference; import org.springframework.core.ResolvableType; import org.springframework.core.io.buffer.DataBuffer; @@ -55,7 +53,6 @@ import tools.jackson.databind.json.JsonMapper; import tools.jackson.databind.type.TypeFactory; -import java.io.IOException; import java.lang.reflect.Type; import java.net.URI; import java.net.URISyntaxException; @@ -768,7 +765,7 @@ private Mono> handleResponse(ClientResponse response, Para if (clazz.isAssignableFrom(ObjectResponse.class)) { try { // Use an ObjectMapper to deserialize the error response - ObjectMapper objectMapper = new ObjectMapper(); + ObjectMapper objectMapper = JsonMapper.builder().build(); ErrorResponse errorResponse = objectMapper.readValue(rawResponse, ErrorResponse.class); if (errorResponse != null) { return Mono.error(new RestClientException("HTTP error occurred: " + response.statusCode(), response.statusCode(), rawResponse, rawResponseHeaders, errorResponse)); diff --git a/rest-client-base/src/test/java/com/wultra/core/rest/client/base/DefaultRestClientTest.java b/rest-client-base/src/test/java/com/wultra/core/rest/client/base/DefaultRestClientTest.java index 82d410d7..5ab853a4 100644 --- a/rest-client-base/src/test/java/com/wultra/core/rest/client/base/DefaultRestClientTest.java +++ b/rest-client-base/src/test/java/com/wultra/core/rest/client/base/DefaultRestClientTest.java @@ -44,8 +44,8 @@ import org.springframework.util.MultiValueMap; import org.springframework.util.ResourceUtils; import reactor.core.publisher.Flux; -import tools.jackson.core.JacksonException; import tools.jackson.databind.ObjectMapper; +import tools.jackson.databind.json.JsonMapper; import java.io.File; import java.io.FileInputStream; @@ -686,7 +686,7 @@ void testDeleteWithFullUrl() throws RestClientException { void testPostWithDataBuffer() throws Exception { String requestData = String.valueOf(System.currentTimeMillis()); ObjectRequest request = new ObjectRequest<>(new TestRequest(requestData)); - ObjectMapper objectMapper = new ObjectMapper(); + ObjectMapper objectMapper = JsonMapper.builder().build(); byte[] data = objectMapper.writeValueAsBytes(request); DefaultDataBufferFactory factory = new DefaultDataBufferFactory(); DefaultDataBuffer dataBuffer = factory.wrap(ByteBuffer.wrap(data)); From 4e3815d1a97a1ba1df9a65d1317a803692cf57c4 Mon Sep 17 00:00:00 2001 From: Roman Strobl Date: Thu, 14 May 2026 12:25:53 +0200 Subject: [PATCH 20/20] Remove redundant configuration --- .../src/main/java/com/wultra/core/audit/base/util/JsonUtil.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/audit-base/src/main/java/com/wultra/core/audit/base/util/JsonUtil.java b/audit-base/src/main/java/com/wultra/core/audit/base/util/JsonUtil.java index bdc3a7c5..e805f66d 100644 --- a/audit-base/src/main/java/com/wultra/core/audit/base/util/JsonUtil.java +++ b/audit-base/src/main/java/com/wultra/core/audit/base/util/JsonUtil.java @@ -20,7 +20,6 @@ import org.slf4j.LoggerFactory; import tools.jackson.core.JacksonException; import tools.jackson.databind.ObjectMapper; -import tools.jackson.databind.SerializationFeature; import tools.jackson.databind.json.JsonMapper; import java.util.Map; @@ -37,7 +36,6 @@ public class JsonUtil { private final ObjectMapper objectMapper = JsonMapper.builder() .changeDefaultPropertyInclusion(incl -> incl .withValueInclusion(JsonInclude.Include.NON_EMPTY)) - .disable(SerializationFeature.FAIL_ON_EMPTY_BEANS) .build(); /**