From 74711d49aed5012ff2c8105bbc09810efdbc774b Mon Sep 17 00:00:00 2001 From: alireza Date: Mon, 5 Oct 2026 02:23:27 +0330 Subject: [PATCH] [enhancement]changed jackson packaging for spring boot 4 compatibility --- pom.xml | 2 +- tosan-httpserver-spring-boot-starter/pom.xml | 6 +-- .../starter/filter/HttpStatisticsFilter.java | 29 +++++++------- .../starter/logger/ByteArraySerializer.java | 16 ++++---- .../server/starter/logger/DateSerializer.java | 15 ++++---- .../logger/MultipartMaskSerializer.java | 14 +++---- .../starter/logger/NumberMaskSerializer.java | 17 ++++----- .../starter/logger/SerializerUtility.java | 17 ++++----- .../starter/logger/StringMaskSerializer.java | 17 ++++----- .../util/JsonHttpLogContentProvider.java | 26 ++++++------- .../server/starter/util/ToStringJsonUtil.java | 38 ++++++++++--------- 11 files changed, 99 insertions(+), 98 deletions(-) diff --git a/pom.xml b/pom.xml index 2c8acf8..5e289bc 100644 --- a/pom.xml +++ b/pom.xml @@ -51,7 +51,7 @@ 17 - 2.3.0 + 3.0.0 diff --git a/tosan-httpserver-spring-boot-starter/pom.xml b/tosan-httpserver-spring-boot-starter/pom.xml index 0da8491..63c161b 100644 --- a/tosan-httpserver-spring-boot-starter/pom.xml +++ b/tosan-httpserver-spring-boot-starter/pom.xml @@ -48,17 +48,13 @@ spring-boot-starter-aspectj - com.fasterxml.jackson.core + tools.jackson.core jackson-databind org.slf4j slf4j-api - - com.fasterxml.jackson.datatype - jackson-datatype-jsr310 - org.springframework.boot spring-boot-starter-test diff --git a/tosan-httpserver-spring-boot-starter/src/main/java/com/tosan/http/server/starter/filter/HttpStatisticsFilter.java b/tosan-httpserver-spring-boot-starter/src/main/java/com/tosan/http/server/starter/filter/HttpStatisticsFilter.java index 172bc5d..b5bc08f 100644 --- a/tosan-httpserver-spring-boot-starter/src/main/java/com/tosan/http/server/starter/filter/HttpStatisticsFilter.java +++ b/tosan-httpserver-spring-boot-starter/src/main/java/com/tosan/http/server/starter/filter/HttpStatisticsFilter.java @@ -1,12 +1,6 @@ package com.tosan.http.server.starter.filter; import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.core.util.DefaultPrettyPrinter; -import com.fasterxml.jackson.databind.DeserializationFeature; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.ObjectWriter; -import com.fasterxml.jackson.databind.SerializationFeature; import com.tosan.http.server.starter.statistics.ServiceExecutionInfo; import com.tosan.http.server.starter.statistics.Statistics; import com.tosan.http.server.starter.util.Constants; @@ -18,6 +12,13 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.core.annotation.Order; +import tools.jackson.core.JacksonException; +import tools.jackson.core.util.DefaultPrettyPrinter; +import tools.jackson.databind.DeserializationFeature; +import tools.jackson.databind.ObjectMapper; +import tools.jackson.databind.ObjectWriter; +import tools.jackson.databind.SerializationFeature; +import tools.jackson.databind.json.JsonMapper; import java.io.IOException; import java.util.ArrayList; @@ -47,12 +48,14 @@ public class HttpStatisticsFilter extends OncePerRequestFilterBase { }}; static { - mapper = new ObjectMapper() - .setSerializationInclusion(JsonInclude.Include.NON_NULL) - .disable(SerializationFeature.FAIL_ON_EMPTY_BEANS) - .configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); printer = new DefaultPrettyPrinter().withObjectIndenter(new DefaultPrettyPrinter.FixedSpaceIndenter()); - writer = mapper.writer(printer); + mapper = JsonMapper.builder() + .changeDefaultPropertyInclusion(incl -> + JsonInclude.Value.construct(JsonInclude.Include.NON_NULL, JsonInclude.Include.NON_NULL)) + .disable(SerializationFeature.FAIL_ON_EMPTY_BEANS) + .disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES) + .build(); + writer = mapper.writer().with(printer); } public HttpStatisticsFilter() { @@ -113,8 +116,8 @@ private List generateStatisticsDetail(List service protected static String writeJson(Object object) { try { return writer.writeValueAsString(object); - } catch (JsonProcessingException e) { + } catch (JacksonException e) { return "error creating json. " + e.getMessage(); } } -} \ No newline at end of file +} diff --git a/tosan-httpserver-spring-boot-starter/src/main/java/com/tosan/http/server/starter/logger/ByteArraySerializer.java b/tosan-httpserver-spring-boot-starter/src/main/java/com/tosan/http/server/starter/logger/ByteArraySerializer.java index 34573e2..614aade 100644 --- a/tosan-httpserver-spring-boot-starter/src/main/java/com/tosan/http/server/starter/logger/ByteArraySerializer.java +++ b/tosan-httpserver-spring-boot-starter/src/main/java/com/tosan/http/server/starter/logger/ByteArraySerializer.java @@ -1,19 +1,19 @@ package com.tosan.http.server.starter.logger; -import com.fasterxml.jackson.core.JsonGenerator; -import com.fasterxml.jackson.databind.JsonSerializer; -import com.fasterxml.jackson.databind.SerializerProvider; - -import java.io.IOException; +import tools.jackson.core.JacksonException; +import tools.jackson.core.JsonGenerator; +import tools.jackson.databind.SerializationContext; +import tools.jackson.databind.ValueSerializer; /** * @author AmirHossein ZamanZade * @since 1/23/2024 */ -public class ByteArraySerializer extends JsonSerializer { +public class ByteArraySerializer extends ValueSerializer { @Override - public void serialize(byte[] value, JsonGenerator jsonGenerator, SerializerProvider serializers) throws IOException { + public void serialize(byte[] value, JsonGenerator jsonGenerator, SerializationContext serializers) + throws JacksonException { jsonGenerator.writeString("*MASKED with size = " + value.length); } -} \ No newline at end of file +} diff --git a/tosan-httpserver-spring-boot-starter/src/main/java/com/tosan/http/server/starter/logger/DateSerializer.java b/tosan-httpserver-spring-boot-starter/src/main/java/com/tosan/http/server/starter/logger/DateSerializer.java index a30185f..b1c88ec 100644 --- a/tosan-httpserver-spring-boot-starter/src/main/java/com/tosan/http/server/starter/logger/DateSerializer.java +++ b/tosan-httpserver-spring-boot-starter/src/main/java/com/tosan/http/server/starter/logger/DateSerializer.java @@ -1,13 +1,13 @@ package com.tosan.http.server.starter.logger; -import com.fasterxml.jackson.core.JsonGenerator; -import com.fasterxml.jackson.databind.JsonSerializer; -import com.fasterxml.jackson.databind.SerializerProvider; +import tools.jackson.core.JacksonException; +import tools.jackson.core.JsonGenerator; +import tools.jackson.databind.SerializationContext; +import tools.jackson.databind.ValueSerializer; -import java.io.IOException; import java.util.Date; -public class DateSerializer extends JsonSerializer { +public class DateSerializer extends ValueSerializer { private final SerializerUtility serializerUtility; @@ -16,7 +16,8 @@ public DateSerializer(SerializerUtility serializerUtility) { } @Override - public void serialize(Date value, JsonGenerator jsonGenerator, SerializerProvider serializers) throws IOException { + public void serialize(Date value, JsonGenerator jsonGenerator, SerializationContext serializers) + throws JacksonException { serializerUtility.serialize(value.toString(), jsonGenerator); } -} \ No newline at end of file +} diff --git a/tosan-httpserver-spring-boot-starter/src/main/java/com/tosan/http/server/starter/logger/MultipartMaskSerializer.java b/tosan-httpserver-spring-boot-starter/src/main/java/com/tosan/http/server/starter/logger/MultipartMaskSerializer.java index ee75eca..7aeca2a 100644 --- a/tosan-httpserver-spring-boot-starter/src/main/java/com/tosan/http/server/starter/logger/MultipartMaskSerializer.java +++ b/tosan-httpserver-spring-boot-starter/src/main/java/com/tosan/http/server/starter/logger/MultipartMaskSerializer.java @@ -1,17 +1,16 @@ package com.tosan.http.server.starter.logger; -import com.fasterxml.jackson.core.JsonGenerator; -import com.fasterxml.jackson.databind.JsonSerializer; -import com.fasterxml.jackson.databind.SerializerProvider; import org.springframework.web.multipart.MultipartFile; - -import java.io.IOException; +import tools.jackson.core.JacksonException; +import tools.jackson.core.JsonGenerator; +import tools.jackson.databind.SerializationContext; +import tools.jackson.databind.ValueSerializer; /** * @author Sadegh Iraji * @since 10/29/2023 **/ -public class MultipartMaskSerializer extends JsonSerializer { +public class MultipartMaskSerializer extends ValueSerializer { private final SerializerUtility serializerUtility; @@ -20,7 +19,8 @@ public MultipartMaskSerializer(SerializerUtility serializerUtility) { } @Override - public void serialize(MultipartFile multipartFile, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException { + public void serialize(MultipartFile multipartFile, JsonGenerator jsonGenerator, + SerializationContext serializers) throws JacksonException { serializerUtility.serialize(multipartFile.getOriginalFilename(), jsonGenerator); } } diff --git a/tosan-httpserver-spring-boot-starter/src/main/java/com/tosan/http/server/starter/logger/NumberMaskSerializer.java b/tosan-httpserver-spring-boot-starter/src/main/java/com/tosan/http/server/starter/logger/NumberMaskSerializer.java index b2d2c9c..f92917a 100644 --- a/tosan-httpserver-spring-boot-starter/src/main/java/com/tosan/http/server/starter/logger/NumberMaskSerializer.java +++ b/tosan-httpserver-spring-boot-starter/src/main/java/com/tosan/http/server/starter/logger/NumberMaskSerializer.java @@ -1,12 +1,11 @@ package com.tosan.http.server.starter.logger; -import com.fasterxml.jackson.core.JsonGenerator; -import com.fasterxml.jackson.databind.JsonSerializer; -import com.fasterxml.jackson.databind.SerializerProvider; +import tools.jackson.core.JacksonException; +import tools.jackson.core.JsonGenerator; +import tools.jackson.databind.SerializationContext; +import tools.jackson.databind.ValueSerializer; -import java.io.IOException; - -public class NumberMaskSerializer extends JsonSerializer { +public class NumberMaskSerializer extends ValueSerializer { private SerializerUtility serializerUtility; @@ -14,8 +13,8 @@ public NumberMaskSerializer(SerializerUtility serializerUtility) { this.serializerUtility = serializerUtility; } - public void serialize(Number value, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) - throws IOException { + public void serialize(Number value, JsonGenerator jsonGenerator, SerializationContext serializers) + throws JacksonException { serializerUtility.serialize(value.toString(), jsonGenerator); } -} \ No newline at end of file +} diff --git a/tosan-httpserver-spring-boot-starter/src/main/java/com/tosan/http/server/starter/logger/SerializerUtility.java b/tosan-httpserver-spring-boot-starter/src/main/java/com/tosan/http/server/starter/logger/SerializerUtility.java index 11cf840..5903074 100644 --- a/tosan-httpserver-spring-boot-starter/src/main/java/com/tosan/http/server/starter/logger/SerializerUtility.java +++ b/tosan-httpserver-spring-boot-starter/src/main/java/com/tosan/http/server/starter/logger/SerializerUtility.java @@ -1,10 +1,9 @@ package com.tosan.http.server.starter.logger; -import com.fasterxml.jackson.core.JsonGenerator; -import com.fasterxml.jackson.core.JsonStreamContext; import com.tosan.tools.mask.starter.replace.JsonReplaceHelperDecider; - -import java.io.IOException; +import tools.jackson.core.JacksonException; +import tools.jackson.core.JsonGenerator; +import tools.jackson.core.TokenStreamContext; public class SerializerUtility { private final JsonReplaceHelperDecider jsonReplaceHelperDecider; @@ -13,12 +12,12 @@ public SerializerUtility(JsonReplaceHelperDecider jsonReplaceHelperDecider) { this.jsonReplaceHelperDecider = jsonReplaceHelperDecider; } - public void serialize(String value, JsonGenerator jsonGenerator) throws IOException { - String fieldName = jsonGenerator.getOutputContext().getCurrentName(); + public void serialize(String value, JsonGenerator jsonGenerator) throws JacksonException { + String fieldName = jsonGenerator.streamWriteContext().currentName(); if (fieldName == null) { - JsonStreamContext parent = jsonGenerator.getOutputContext().getParent(); + TokenStreamContext parent = jsonGenerator.streamWriteContext().getParent(); if (parent != null) { - fieldName = parent.getCurrentName(); + fieldName = parent.currentName(); } } if (value == null) { @@ -27,4 +26,4 @@ public void serialize(String value, JsonGenerator jsonGenerator) throws IOExcept String maskedValue = jsonReplaceHelperDecider.replace(fieldName, value); jsonGenerator.writeString(maskedValue); } -} \ No newline at end of file +} diff --git a/tosan-httpserver-spring-boot-starter/src/main/java/com/tosan/http/server/starter/logger/StringMaskSerializer.java b/tosan-httpserver-spring-boot-starter/src/main/java/com/tosan/http/server/starter/logger/StringMaskSerializer.java index 669db3d..79f63cd 100644 --- a/tosan-httpserver-spring-boot-starter/src/main/java/com/tosan/http/server/starter/logger/StringMaskSerializer.java +++ b/tosan-httpserver-spring-boot-starter/src/main/java/com/tosan/http/server/starter/logger/StringMaskSerializer.java @@ -1,16 +1,15 @@ package com.tosan.http.server.starter.logger; -import com.fasterxml.jackson.core.JsonGenerator; -import com.fasterxml.jackson.databind.JsonSerializer; -import com.fasterxml.jackson.databind.SerializerProvider; - -import java.io.IOException; +import tools.jackson.core.JacksonException; +import tools.jackson.core.JsonGenerator; +import tools.jackson.databind.SerializationContext; +import tools.jackson.databind.ValueSerializer; /** * @author mina khoshnevisan * @since 7/31/2022 */ -public class StringMaskSerializer extends JsonSerializer { +public class StringMaskSerializer extends ValueSerializer { private final SerializerUtility serializerUtility; @@ -18,8 +17,8 @@ public StringMaskSerializer(SerializerUtility serializerUtility) { this.serializerUtility = serializerUtility; } - public void serialize(String value, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) - throws IOException { + public void serialize(String value, JsonGenerator jsonGenerator, SerializationContext serializers) + throws JacksonException { serializerUtility.serialize(value, jsonGenerator); } -} \ No newline at end of file +} diff --git a/tosan-httpserver-spring-boot-starter/src/main/java/com/tosan/http/server/starter/util/JsonHttpLogContentProvider.java b/tosan-httpserver-spring-boot-starter/src/main/java/com/tosan/http/server/starter/util/JsonHttpLogContentProvider.java index 7e606c0..1f83104 100644 --- a/tosan-httpserver-spring-boot-starter/src/main/java/com/tosan/http/server/starter/util/JsonHttpLogContentProvider.java +++ b/tosan-httpserver-spring-boot-starter/src/main/java/com/tosan/http/server/starter/util/JsonHttpLogContentProvider.java @@ -1,12 +1,13 @@ package com.tosan.http.server.starter.util; import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.DeserializationFeature; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.SerializationFeature; import com.tosan.http.server.starter.wrapper.LogContentContainer; import org.apache.commons.lang3.StringUtils; +import tools.jackson.core.JacksonException; +import tools.jackson.databind.DeserializationFeature; +import tools.jackson.databind.ObjectMapper; +import tools.jackson.databind.SerializationFeature; +import tools.jackson.databind.json.JsonMapper; import java.util.LinkedHashMap; import java.util.Map; @@ -17,14 +18,13 @@ */ public class JsonHttpLogContentProvider extends LogContentProvider { - private static final ObjectMapper MAPPER = new ObjectMapper(); - - static { - MAPPER.enable(SerializationFeature.INDENT_OUTPUT) - .disable(SerializationFeature.FAIL_ON_EMPTY_BEANS) - .setSerializationInclusion(JsonInclude.Include.NON_NULL) - .configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); - } + private static final ObjectMapper MAPPER = JsonMapper.builder() + .enable(SerializationFeature.INDENT_OUTPUT) + .disable(SerializationFeature.FAIL_ON_EMPTY_BEANS) + .changeDefaultPropertyInclusion(incl -> + JsonInclude.Value.construct(JsonInclude.Include.NON_NULL, JsonInclude.Include.NON_NULL)) + .disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES) + .build(); @Override protected String generateRequestLogContent(LogContentContainer container) { @@ -75,7 +75,7 @@ private void addBody(LogContentContainer container, Map objectMa private String toJson(Object value) { try { return MAPPER.writeValueAsString(value); - } catch (JsonProcessingException e) { + } catch (JacksonException e) { return "error creating json. " + e.getMessage(); } } diff --git a/tosan-httpserver-spring-boot-starter/src/main/java/com/tosan/http/server/starter/util/ToStringJsonUtil.java b/tosan-httpserver-spring-boot-starter/src/main/java/com/tosan/http/server/starter/util/ToStringJsonUtil.java index ba5698c..585d891 100644 --- a/tosan-httpserver-spring-boot-starter/src/main/java/com/tosan/http/server/starter/util/ToStringJsonUtil.java +++ b/tosan-httpserver-spring-boot-starter/src/main/java/com/tosan/http/server/starter/util/ToStringJsonUtil.java @@ -1,14 +1,15 @@ package com.tosan.http.server.starter.util; import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.DeserializationFeature; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.SerializationFeature; -import com.fasterxml.jackson.databind.module.SimpleModule; import com.tosan.http.server.starter.logger.*; import com.tosan.tools.mask.starter.replace.JsonReplaceHelperDecider; import org.springframework.web.multipart.MultipartFile; +import tools.jackson.core.JacksonException; +import tools.jackson.databind.DeserializationFeature; +import tools.jackson.databind.ObjectMapper; +import tools.jackson.databind.SerializationFeature; +import tools.jackson.databind.json.JsonMapper; +import tools.jackson.databind.module.SimpleModule; import java.text.SimpleDateFormat; import java.util.Date; @@ -18,19 +19,15 @@ * @since 6/10/2021 */ public class ToStringJsonUtil { - private final ObjectMapper mapper = new ObjectMapper(); + private final ObjectMapper mapper; private final JsonReplaceHelperDecider jsonReplaceHelperDecider; public ToStringJsonUtil(JsonReplaceHelperDecider jsonReplaceHelperDecider) { this.jsonReplaceHelperDecider = jsonReplaceHelperDecider; - customizeObjectMapper(); + this.mapper = createObjectMapper(); } - private void customizeObjectMapper() { - mapper.enable(SerializationFeature.INDENT_OUTPUT) - .disable(SerializationFeature.FAIL_ON_EMPTY_BEANS) - .setSerializationInclusion(JsonInclude.Include.NON_NULL) - .configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); + private ObjectMapper createObjectMapper() { SimpleModule module = new SimpleModule(); SerializerUtility serializerUtility = new SerializerUtility(jsonReplaceHelperDecider); StringMaskSerializer stringMaskSerializer = new StringMaskSerializer(serializerUtility); @@ -47,16 +44,23 @@ private void customizeObjectMapper() { DateSerializer dateSerializer = new DateSerializer(serializerUtility); module.addSerializer(Date.class, dateSerializer); module.addSerializer(MultipartFile.class, multipartMaskSerializer); - mapper.registerModule(module); - mapper.findAndRegisterModules(); - mapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd'T'H:m:ssZ")); + return JsonMapper.builder() + .enable(SerializationFeature.INDENT_OUTPUT) + .disable(SerializationFeature.FAIL_ON_EMPTY_BEANS) + .changeDefaultPropertyInclusion(incl -> + JsonInclude.Value.construct(JsonInclude.Include.NON_NULL, JsonInclude.Include.NON_NULL)) + .disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES) + .addModule(module) + .findAndAddModules() + .defaultDateFormat(new SimpleDateFormat("yyyy-MM-dd'T'H:m:ssZ")) + .build(); } public String toJson(T object) { try { return mapper.writeValueAsString(object); - } catch (JsonProcessingException e) { + } catch (JacksonException e) { return "error creating json. " + e.getMessage(); } } -} \ No newline at end of file +}