diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index 3ab8c506b4..0a4582946a 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -37,7 +37,7 @@ jobs: - name: Set up Java uses: actions/setup-java@v1 with: - java-version: 11 + java-version: 17 # Initializes the CodeQL tools for scanning. - name: Initialize CodeQL uses: github/codeql-action/init@v3 diff --git a/.github/workflows/maven-pulls.yml b/.github/workflows/maven-pulls.yml index d2a3f0d85c..b57b0904ee 100644 --- a/.github/workflows/maven-pulls.yml +++ b/.github/workflows/maven-pulls.yml @@ -10,7 +10,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - java: [ 11, 17 ] + java: [ 17, 25 ] steps: - uses: actions/checkout@v4 diff --git a/.github/workflows/maven.yml b/.github/workflows/maven.yml index 67d45a81e6..418442d258 100644 --- a/.github/workflows/maven.yml +++ b/.github/workflows/maven.yml @@ -10,7 +10,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - java: [ 11, 17 ] + java: [ 17, 25 ] steps: - uses: actions/checkout@v4 @@ -41,7 +41,7 @@ jobs: cd ../.. export MY_JAVA_VERSION=`java -version 2>&1 | head -1 | cut -d'"' -f2 | sed '/^1\./s///' | cut -d'.' -f1` echo "JAVA VERSION" ${MY_JAVA_VERSION} - if [[ ${MY_JAVA_VERSION} == "11" ]]; + if [[ ${MY_JAVA_VERSION} == "17" ]]; then export MY_POM_VERSION=`./mvnw -q -Dexec.executable="echo" -Dexec.args='${projects.version}' --non-recursive org.codehaus.mojo:exec-maven-plugin:1.3.1:exec` echo "POM VERSION" ${MY_POM_VERSION} diff --git a/.github/workflows/prepare-release.yml b/.github/workflows/prepare-release.yml index 75742a8371..4aa3596046 100644 --- a/.github/workflows/prepare-release.yml +++ b/.github/workflows/prepare-release.yml @@ -20,10 +20,10 @@ jobs: uses: actions/setup-python@v4 with: python-version: '3.10' - - name: Set up Java 11 + - name: Set up Java 17 uses: actions/setup-java@v4 with: - java-version: 11 + java-version: 17 distribution: temurin server-id: central server-username: MAVEN_USERNAME diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 181e592ecd..7e111c8c80 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -20,10 +20,10 @@ jobs: uses: actions/setup-python@v4 with: python-version: '3.10' - - name: Set up Java 11 + - name: Set up Java 17 uses: actions/setup-java@v4 with: - java-version: 11 + java-version: 17 distribution: temurin server-id: central server-username: MAVEN_USERNAME diff --git a/README.md b/README.md index 9f4c2fcf6e..9f27f242cb 100644 --- a/README.md +++ b/README.md @@ -129,9 +129,9 @@ If you're interested in the change history of swagger and the Swagger Core frame ### Prerequisites You need the following installed and available in your $PATH: -* Java 11 +* Java 17 * Apache maven 3.0.4 or greater -* Jackson 2.4.5 or greater +* Jackson 3.0.3 or greater ### To build from source (currently 2.2.42-SNAPSHOT) diff --git a/modules/swagger-core/pom.xml b/modules/swagger-core/pom.xml index f4710cf50a..94e920a273 100644 --- a/modules/swagger-core/pom.xml +++ b/modules/swagger-core/pom.xml @@ -55,7 +55,6 @@ jakarta.xml.bind jakarta.xml.bind-api - 2.3.3 org.apache.commons @@ -70,16 +69,14 @@ jackson-annotations - com.fasterxml.jackson.core + tools.jackson.core jackson-databind + 3.0.3 - com.fasterxml.jackson.dataformat + tools.jackson.dataformat jackson-dataformat-yaml - - - com.fasterxml.jackson.datatype - jackson-datatype-jsr310 + 3.0.3 io.swagger.core.v3 @@ -121,6 +118,12 @@ logback-core provided + + jakarta.annotation + jakarta.annotation-api + 1.3.5 + provided + jakarta.validation jakarta.validation-api diff --git a/modules/swagger-core/src/main/java/io/swagger/v3/core/converter/ModelConverters.java b/modules/swagger-core/src/main/java/io/swagger/v3/core/converter/ModelConverters.java index 241a850f67..c08a22956a 100644 --- a/modules/swagger-core/src/main/java/io/swagger/v3/core/converter/ModelConverters.java +++ b/modules/swagger-core/src/main/java/io/swagger/v3/core/converter/ModelConverters.java @@ -1,6 +1,9 @@ package io.swagger.v3.core.converter; -import com.fasterxml.jackson.databind.type.TypeFactory; +import tools.jackson.databind.ObjectMapper; +import tools.jackson.databind.cfg.MapperBuilder; +import tools.jackson.databind.json.JsonMapper; +import tools.jackson.databind.type.TypeFactory; import io.swagger.v3.core.jackson.ModelResolver; import io.swagger.v3.core.util.Configuration; import io.swagger.v3.core.util.Json; @@ -20,6 +23,7 @@ import java.util.ServiceLoader; import java.util.Set; import java.util.concurrent.CopyOnWriteArrayList; +import java.util.function.Consumer; public class ModelConverters { private static ModelConverters SINGLETON = null; @@ -30,8 +34,7 @@ public class ModelConverters { private final Set skippedClasses = new HashSet<>(); public ModelConverters() { - converters = new CopyOnWriteArrayList<>(); - converters.add(new ModelResolver(Json.mapper())); + this(false); } public ModelConverters(boolean openapi31) { @@ -52,6 +55,15 @@ public ModelConverters(boolean openapi31, Schema.SchemaResolution schemaResoluti } } + public ModelConverters(boolean openapi31, Consumer>> mapperBuilderCustomizer) { + converters = new CopyOnWriteArrayList<>(); + if (openapi31) { + converters.add(new ModelResolver(Json31.mapper(mapperBuilderCustomizer)).openapi31(true)); + } else { + converters.add(new ModelResolver(Json.mapper(mapperBuilderCustomizer))); + } + } + public ModelConverters(Configuration configuration) { converters = new CopyOnWriteArrayList<>(); boolean openapi31 =configuration != null && configuration.isOpenAPI31() != null && configuration.isOpenAPI31(); @@ -67,20 +79,32 @@ public Set getSkippedPackages() { } public static ModelConverters getInstance(boolean openapi31) { + return getInstance(openapi31, mapperBuilder -> {}); + } + + public static ModelConverters getInstance(boolean openapi31, Consumer>> mapperBuilderCustomizer) { if (openapi31) { if (SINGLETON31 == null) { - SINGLETON31 = new ModelConverters(openapi31); + SINGLETON31 = new ModelConverters(openapi31, mapperBuilderCustomizer); init(SINGLETON31); } return SINGLETON31; } if (SINGLETON == null) { - SINGLETON = new ModelConverters(openapi31); + SINGLETON = new ModelConverters(openapi31, mapperBuilderCustomizer); init(SINGLETON); } return SINGLETON; } + public static ModelConverters getInstance() { + return getInstance(false); + } + + public static ModelConverters getInstance(Consumer>> mapperBuilderCustomizer) { + return getInstance(false, mapperBuilderCustomizer); + } + public static void reset() { synchronized (ModelConverters.class) { SINGLETON = null; @@ -145,10 +169,6 @@ private static void init(ModelConverters converter) { } } - public static ModelConverters getInstance() { - return getInstance(false); - } - public void addConverter(ModelConverter converter) { converters.add(0, converter); @@ -233,7 +253,7 @@ public boolean isRegisteredAsSkippedClass(String className) { } private boolean shouldProcess(Type type) { - final Class cls = TypeFactory.defaultInstance().constructType(type).getRawClass(); + final Class cls = TypeFactory.createDefaultInstance().constructType(type).getRawClass(); if (cls.isPrimitive()) { return false; } diff --git a/modules/swagger-core/src/main/java/io/swagger/v3/core/filter/SpecFilter.java b/modules/swagger-core/src/main/java/io/swagger/v3/core/filter/SpecFilter.java index d4bf2a9c47..f0c5c4c02f 100755 --- a/modules/swagger-core/src/main/java/io/swagger/v3/core/filter/SpecFilter.java +++ b/modules/swagger-core/src/main/java/io/swagger/v3/core/filter/SpecFilter.java @@ -21,6 +21,7 @@ import io.swagger.v3.oas.models.responses.ApiResponses; import io.swagger.v3.oas.models.tags.Tag; import org.apache.commons.lang3.StringUtils; +import tools.jackson.core.JacksonException; import java.io.IOException; import java.util.ArrayList; @@ -290,7 +291,7 @@ protected Map filterComponentsSchema(OpenAPISpecFilter filter, M } clonedComponentsSchema.put(key, clonedModel); - } catch (IOException e) { + } catch (JacksonException e) { } } } diff --git a/modules/swagger-core/src/main/java/io/swagger/v3/core/jackson/AbstractModelConverter.java b/modules/swagger-core/src/main/java/io/swagger/v3/core/jackson/AbstractModelConverter.java index cff6f2161a..e79c33cfdb 100644 --- a/modules/swagger-core/src/main/java/io/swagger/v3/core/jackson/AbstractModelConverter.java +++ b/modules/swagger-core/src/main/java/io/swagger/v3/core/jackson/AbstractModelConverter.java @@ -1,13 +1,17 @@ package io.swagger.v3.core.jackson; -import com.fasterxml.jackson.core.Version; -import com.fasterxml.jackson.databind.AnnotationIntrospector; -import com.fasterxml.jackson.databind.BeanDescription; -import com.fasterxml.jackson.databind.JavaType; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.PropertyName; -import com.fasterxml.jackson.databind.jsontype.NamedType; -import com.fasterxml.jackson.databind.module.SimpleModule; +import tools.jackson.core.Version; +import tools.jackson.databind.AnnotationIntrospector; +import tools.jackson.databind.BeanDescription; +import tools.jackson.databind.JavaType; +import tools.jackson.databind.ObjectMapper; +import tools.jackson.databind.PropertyName; +import tools.jackson.databind.cfg.MapperBuilder; +import tools.jackson.databind.introspect.AccessorNamingStrategy; +import tools.jackson.databind.introspect.BasicBeanDescription; +import tools.jackson.databind.introspect.DefaultAccessorNamingStrategy; +import tools.jackson.databind.jsontype.NamedType; +import tools.jackson.databind.module.SimpleModule; import io.swagger.v3.core.converter.AnnotatedType; import io.swagger.v3.core.converter.ModelConverter; import io.swagger.v3.core.converter.ModelConverterContext; @@ -33,14 +37,16 @@ protected AbstractModelConverter(ObjectMapper mapper) { } protected AbstractModelConverter(ObjectMapper mapper, TypeNameResolver typeNameResolver) { - mapper.registerModule( - new SimpleModule("swagger", Version.unknownVersion()) { + _mapper = mapper.rebuild() + .addModule(new SimpleModule("swagger", Version.unknownVersion()) { @Override public void setupModule(SetupContext context) { context.insertAnnotationIntrospector(new SwaggerAnnotationIntrospector()); } - }); - _mapper = mapper; + }) + .accessorNaming(new DefaultAccessorNamingStrategy.Provider() + .withFirstCharAcceptance(true, true)) + .build(); _typeNameResolver = typeNameResolver; } @@ -61,7 +67,7 @@ public Schema resolve(AnnotatedType type, ModelConverterContext context, Iterato * @return the current AnnotationIntrospector */ protected AnnotationIntrospector _intr() { - return _mapper.getSerializationConfig().getAnnotationIntrospector(); + return _mapper.serializationConfig().getAnnotationIntrospector(); } protected String _typeName(JavaType type) { @@ -95,10 +101,10 @@ protected String _findTypeName(JavaType type, BeanDescription beanDesc) { return "List"; } if (beanDesc == null) { - beanDesc = _mapper.getSerializationConfig().introspectClassAnnotations(type); + beanDesc = _mapper._serializationContext().introspectBeanDescription(type); } - PropertyName rootName = _intr().findRootName(beanDesc.getClassInfo()); + PropertyName rootName = _intr().findRootName(_mapper.serializationConfig(), beanDesc.getClassInfo()); if (rootName != null && rootName.hasSimpleName()) { return rootName.getSimpleName(); } diff --git a/modules/swagger-core/src/main/java/io/swagger/v3/core/jackson/ApiResponsesSerializer.java b/modules/swagger-core/src/main/java/io/swagger/v3/core/jackson/ApiResponsesSerializer.java index 5107400042..281347a097 100644 --- a/modules/swagger-core/src/main/java/io/swagger/v3/core/jackson/ApiResponsesSerializer.java +++ b/modules/swagger-core/src/main/java/io/swagger/v3/core/jackson/ApiResponsesSerializer.java @@ -1,36 +1,37 @@ package io.swagger.v3.core.jackson; -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 io.swagger.v3.oas.models.responses.ApiResponses; +import tools.jackson.databind.SerializationContext; +import tools.jackson.databind.ValueSerializer; import java.io.IOException; import java.util.Map; import java.util.Map.Entry; -public class ApiResponsesSerializer extends JsonSerializer { +public class ApiResponsesSerializer extends ValueSerializer { @Override public void serialize( - ApiResponses value, JsonGenerator jgen, SerializerProvider provider) - throws IOException { + ApiResponses value, JsonGenerator jgen, SerializationContext provider) + throws JacksonException { if (value != null && value.getExtensions() != null && !value.getExtensions().isEmpty()) { jgen.writeStartObject(); if (!value.isEmpty()) { for (Entry entry: value.entrySet()) { - jgen.writeObjectField(entry.getKey() , entry.getValue()); + jgen.writePOJOProperty(entry.getKey() , entry.getValue()); } } for (Map.Entry entry: value.getExtensions().entrySet()) { - jgen.writeObjectField(entry.getKey(), entry.getValue()); + jgen.writePOJOProperty(entry.getKey(), entry.getValue()); } jgen.writeEndObject(); } else { - provider.defaultSerializeValue(value, jgen); + jgen.writePOJO(value); } } } diff --git a/modules/swagger-core/src/main/java/io/swagger/v3/core/jackson/CallbackSerializer.java b/modules/swagger-core/src/main/java/io/swagger/v3/core/jackson/CallbackSerializer.java index 9d3dd5757c..c45c9824eb 100644 --- a/modules/swagger-core/src/main/java/io/swagger/v3/core/jackson/CallbackSerializer.java +++ b/modules/swagger-core/src/main/java/io/swagger/v3/core/jackson/CallbackSerializer.java @@ -1,22 +1,23 @@ package io.swagger.v3.core.jackson; -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 io.swagger.v3.oas.models.PathItem; import io.swagger.v3.oas.models.callbacks.Callback; import org.apache.commons.lang3.StringUtils; +import tools.jackson.databind.SerializationContext; +import tools.jackson.databind.ValueSerializer; import java.io.IOException; import java.util.Map.Entry; -public class CallbackSerializer extends JsonSerializer { +public class CallbackSerializer extends ValueSerializer { @Override public void serialize( - Callback value, JsonGenerator jgen, SerializerProvider provider) - throws IOException { + Callback value, JsonGenerator jgen, SerializationContext provider) + throws JacksonException { // has extensions if (value != null && value.getExtensions() != null && !value.getExtensions().isEmpty()) { @@ -27,22 +28,22 @@ public void serialize( if (!value.isEmpty()) { // write map for (Entry entry: value.entrySet()) { - jgen.writeObjectField(entry.getKey() , entry.getValue()); + jgen.writePOJOProperty(entry.getKey() , entry.getValue()); } } } else { // handle ref schema serialization skipping all other props ... - jgen.writeStringField("$ref", value.get$ref()); + jgen.writeStringProperty("$ref", value.get$ref()); } for (String ext: value.getExtensions().keySet()) { - jgen.writeObjectField(ext , value.getExtensions().get(ext)); + jgen.writePOJOProperty(ext , value.getExtensions().get(ext)); } jgen.writeEndObject(); } else { if (value == null || StringUtils.isBlank(value.get$ref())) { - provider.defaultSerializeValue(value, jgen); + jgen.writePOJO(value); } else { // handle ref schema serialization skipping all other props jgen.writeStartObject(); - jgen.writeStringField("$ref", value.get$ref()); + jgen.writeStringProperty("$ref", value.get$ref()); jgen.writeEndObject(); } } diff --git a/modules/swagger-core/src/main/java/io/swagger/v3/core/jackson/ExampleSerializer.java b/modules/swagger-core/src/main/java/io/swagger/v3/core/jackson/ExampleSerializer.java index 577b880c1e..1ad3380b0a 100644 --- a/modules/swagger-core/src/main/java/io/swagger/v3/core/jackson/ExampleSerializer.java +++ b/modules/swagger-core/src/main/java/io/swagger/v3/core/jackson/ExampleSerializer.java @@ -1,38 +1,34 @@ package io.swagger.v3.core.jackson; -import com.fasterxml.jackson.core.JsonGenerator; -import com.fasterxml.jackson.databind.JsonMappingException; -import com.fasterxml.jackson.databind.JsonSerializer; -import com.fasterxml.jackson.databind.SerializerProvider; -import com.fasterxml.jackson.databind.ser.ResolvableSerializer; +import tools.jackson.core.JacksonException; +import tools.jackson.core.JsonGenerator; import io.swagger.v3.oas.models.examples.Example; +import tools.jackson.databind.DatabindException; +import tools.jackson.databind.SerializationContext; +import tools.jackson.databind.ValueSerializer; -import java.io.IOException; +public class ExampleSerializer extends ValueSerializer { -public class ExampleSerializer extends JsonSerializer implements ResolvableSerializer { + private ValueSerializer defaultSerializer; - private JsonSerializer defaultSerializer; - - public ExampleSerializer(JsonSerializer serializer) { + public ExampleSerializer(ValueSerializer serializer) { defaultSerializer = serializer; } @Override - public void resolve(SerializerProvider serializerProvider) throws JsonMappingException { - if (defaultSerializer instanceof ResolvableSerializer) { - ((ResolvableSerializer) defaultSerializer).resolve(serializerProvider); - } + public void resolve(SerializationContext serializerProvider) throws DatabindException { + defaultSerializer.resolve(serializerProvider); } @Override public void serialize( - Example example, JsonGenerator jgen, SerializerProvider provider) - throws IOException { + Example example, JsonGenerator jgen, SerializationContext provider) + throws JacksonException { if (example.getValueSetFlag() && example.getValue() == null) { jgen.writeStartObject(); defaultSerializer.unwrappingSerializer(null).serialize(example, jgen, provider); - jgen.writeNullField("value"); + jgen.writeNullProperty("value"); jgen.writeEndObject(); } else { defaultSerializer.serialize(example, jgen, provider); diff --git a/modules/swagger-core/src/main/java/io/swagger/v3/core/jackson/JAXBAnnotationsHelper.java b/modules/swagger-core/src/main/java/io/swagger/v3/core/jackson/JAXBAnnotationsHelper.java index 5331404491..e9369fc52d 100644 --- a/modules/swagger-core/src/main/java/io/swagger/v3/core/jackson/JAXBAnnotationsHelper.java +++ b/modules/swagger-core/src/main/java/io/swagger/v3/core/jackson/JAXBAnnotationsHelper.java @@ -1,6 +1,6 @@ package io.swagger.v3.core.jackson; -import com.fasterxml.jackson.databind.introspect.Annotated; +import tools.jackson.databind.introspect.Annotated; import io.swagger.v3.core.util.AnnotationsUtils; import io.swagger.v3.oas.models.media.ArraySchema; import io.swagger.v3.oas.models.media.MapSchema; diff --git a/modules/swagger-core/src/main/java/io/swagger/v3/core/jackson/MediaTypeSerializer.java b/modules/swagger-core/src/main/java/io/swagger/v3/core/jackson/MediaTypeSerializer.java index 809261d3e9..51d01ba987 100644 --- a/modules/swagger-core/src/main/java/io/swagger/v3/core/jackson/MediaTypeSerializer.java +++ b/modules/swagger-core/src/main/java/io/swagger/v3/core/jackson/MediaTypeSerializer.java @@ -1,38 +1,34 @@ package io.swagger.v3.core.jackson; -import com.fasterxml.jackson.core.JsonGenerator; -import com.fasterxml.jackson.databind.JsonMappingException; -import com.fasterxml.jackson.databind.JsonSerializer; -import com.fasterxml.jackson.databind.SerializerProvider; -import com.fasterxml.jackson.databind.ser.ResolvableSerializer; +import tools.jackson.core.JacksonException; +import tools.jackson.core.JsonGenerator; import io.swagger.v3.oas.models.media.MediaType; +import tools.jackson.databind.DatabindException; +import tools.jackson.databind.SerializationContext; +import tools.jackson.databind.ValueSerializer; -import java.io.IOException; +public class MediaTypeSerializer extends ValueSerializer { -public class MediaTypeSerializer extends JsonSerializer implements ResolvableSerializer { + private ValueSerializer defaultSerializer; - private JsonSerializer defaultSerializer; - - public MediaTypeSerializer(JsonSerializer serializer) { + public MediaTypeSerializer(ValueSerializer serializer) { defaultSerializer = serializer; } @Override - public void resolve(SerializerProvider serializerProvider) throws JsonMappingException { - if (defaultSerializer instanceof ResolvableSerializer) { - ((ResolvableSerializer) defaultSerializer).resolve(serializerProvider); - } + public void resolve(SerializationContext serializerProvider) throws DatabindException { + defaultSerializer.resolve(serializerProvider); } @Override public void serialize( - MediaType value, JsonGenerator jgen, SerializerProvider provider) - throws IOException { + MediaType value, JsonGenerator jgen, SerializationContext provider) + throws JacksonException { if (value.getExampleSetFlag() && value.getExample() == null) { jgen.writeStartObject(); defaultSerializer.unwrappingSerializer(null).serialize(value, jgen, provider); - jgen.writeNullField("example"); + jgen.writeNullProperty("example"); jgen.writeEndObject(); } else { defaultSerializer.serialize(value, jgen, provider); diff --git a/modules/swagger-core/src/main/java/io/swagger/v3/core/jackson/ModelResolver.java b/modules/swagger-core/src/main/java/io/swagger/v3/core/jackson/ModelResolver.java index fa9da08ca0..b951af9b4d 100644 --- a/modules/swagger-core/src/main/java/io/swagger/v3/core/jackson/ModelResolver.java +++ b/modules/swagger-core/src/main/java/io/swagger/v3/core/jackson/ModelResolver.java @@ -12,22 +12,24 @@ import com.fasterxml.jackson.annotation.JsonView; import com.fasterxml.jackson.annotation.ObjectIdGenerator; import com.fasterxml.jackson.annotation.ObjectIdGenerators; -import com.fasterxml.jackson.databind.AnnotationIntrospector; -import com.fasterxml.jackson.databind.BeanDescription; -import com.fasterxml.jackson.databind.JavaType; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.PropertyMetadata; -import com.fasterxml.jackson.databind.SerializationFeature; -import com.fasterxml.jackson.databind.annotation.JsonSerialize; -import com.fasterxml.jackson.databind.introspect.Annotated; -import com.fasterxml.jackson.databind.introspect.AnnotatedClass; -import com.fasterxml.jackson.databind.introspect.AnnotatedField; -import com.fasterxml.jackson.databind.introspect.AnnotatedMember; -import com.fasterxml.jackson.databind.introspect.AnnotatedMethod; -import com.fasterxml.jackson.databind.introspect.BeanPropertyDefinition; -import com.fasterxml.jackson.databind.introspect.POJOPropertyBuilder; -import com.fasterxml.jackson.databind.jsontype.NamedType; -import com.fasterxml.jackson.databind.util.Annotations; +import tools.jackson.core.JacksonException; +import tools.jackson.databind.AnnotationIntrospector; +import tools.jackson.databind.BeanDescription; +import tools.jackson.databind.JavaType; +import tools.jackson.databind.ObjectMapper; +import tools.jackson.databind.PropertyMetadata; +import tools.jackson.databind.SerializationFeature; +import tools.jackson.databind.annotation.JsonSerialize; +import tools.jackson.databind.cfg.EnumFeature; +import tools.jackson.databind.introspect.Annotated; +import tools.jackson.databind.introspect.AnnotatedClass; +import tools.jackson.databind.introspect.AnnotatedField; +import tools.jackson.databind.introspect.AnnotatedMember; +import tools.jackson.databind.introspect.AnnotatedMethod; +import tools.jackson.databind.introspect.BeanPropertyDefinition; +import tools.jackson.databind.introspect.POJOPropertyBuilder; +import tools.jackson.databind.jsontype.NamedType; +import tools.jackson.databind.util.Annotations; import io.swagger.v3.core.converter.AnnotatedType; import io.swagger.v3.core.converter.ModelConverter; import io.swagger.v3.core.converter.ModelConverterContext; @@ -179,20 +181,20 @@ public Schema resolve(AnnotatedType annotatedType, ModelConverterContext context final io.swagger.v3.oas.annotations.media.Schema resolvedSchemaAnnotation = resolvedSchemaOrArrayAnnotation == null ? null : - resolvedSchemaOrArrayAnnotation instanceof io.swagger.v3.oas.annotations.media.ArraySchema ? - ((io.swagger.v3.oas.annotations.media.ArraySchema) resolvedSchemaOrArrayAnnotation).schema() : + resolvedSchemaOrArrayAnnotation instanceof io.swagger.v3.oas.annotations.media.ArraySchema as1 ? + as1.schema() : (io.swagger.v3.oas.annotations.media.Schema) resolvedSchemaOrArrayAnnotation; final io.swagger.v3.oas.annotations.media.ArraySchema resolvedArrayAnnotation = resolvedSchemaOrArrayAnnotation == null ? null : - resolvedSchemaOrArrayAnnotation instanceof io.swagger.v3.oas.annotations.media.ArraySchema ? - (io.swagger.v3.oas.annotations.media.ArraySchema) resolvedSchemaOrArrayAnnotation : + resolvedSchemaOrArrayAnnotation instanceof io.swagger.v3.oas.annotations.media.ArraySchema as1 ? + as1 : null; final BeanDescription beanDesc; { - BeanDescription recurBeanDesc = _mapper.getSerializationConfig().introspect(type); + BeanDescription recurBeanDesc = _mapper._serializationContext().introspectBeanDescription(type); HashSet visited = new HashSet<>(); JsonSerialize jsonSerialize = recurBeanDesc.getClassAnnotations().get(JsonSerialize.class); @@ -201,7 +203,7 @@ public Schema resolve(AnnotatedType annotatedType, ModelConverterContext context if (visited.contains(asName)) break; visited.add(asName); - recurBeanDesc = _mapper.getSerializationConfig().introspect( + recurBeanDesc = _mapper._serializationContext().introspectBeanDescription( _mapper.constructType(jsonSerialize.as()) ); jsonSerialize = recurBeanDesc.getClassAnnotations().get(JsonSerialize.class); @@ -471,7 +473,7 @@ public Schema resolve(AnnotatedType annotatedType, ModelConverterContext context JavaType valueType = type.getContentType(); String pName = null; if (valueType != null) { - BeanDescription valueTypeBeanDesc = _mapper.getSerializationConfig().introspect(valueType); + BeanDescription valueTypeBeanDesc = _mapper._serializationContext().introspectBeanDescription(valueType); pName = _typeName(valueType, valueTypeBeanDesc); } List strippedCtxAnnotations = new ArrayList<>(); @@ -551,8 +553,7 @@ public Schema resolve(AnnotatedType annotatedType, ModelConverterContext context if (annotatedType.isSchemaProperty() && annotatedType.getCtxAnnotations() != null && annotatedType.getCtxAnnotations().length > 0) { if (!"object".equals(items.getType())) { for (Annotation annotation : annotatedType.getCtxAnnotations()) { - if (annotation instanceof XmlElement) { - XmlElement xmlElement = (XmlElement) annotation; + if (annotation instanceof XmlElement xmlElement) { if (xmlElement != null && xmlElement.name() != null && !"".equals(xmlElement.name()) && !JAXB_DEFAULT.equals(xmlElement.name())) { XML xml = items.getXml() != null ? items.getXml() : new XML(); xml.setName(xmlElement.name()); @@ -662,7 +663,7 @@ public Schema resolve(AnnotatedType annotatedType, ModelConverterContext context AnnotatedMember member = propDef.getPrimaryMember(); if (member == null) { - final BeanDescription deserBeanDesc = _mapper.getDeserializationConfig().introspect(type); + final BeanDescription deserBeanDesc = _mapper._deserializationContext().introspectBeanDescription(type); List deserProperties = deserBeanDesc.findProperties(); for (BeanPropertyDefinition prop : deserProperties) { if (StringUtils.isNotBlank(prop.getInternalName()) && prop.getInternalName().equals(propDef.getInternalName())) { @@ -701,12 +702,7 @@ public Schema resolve(AnnotatedType annotatedType, ModelConverterContext context if (member != null && !ignore(member, xmlAccessorTypeAnnotation, propName, propertiesToIgnore, propDef)) { - List annotationList = new ArrayList<>(); - for (Annotation a : member.annotations()) { - annotationList.add(a); - } - - annotations = annotationList.toArray(new Annotation[annotationList.size()]); + annotations = member.annotations().toArray(Annotation[]::new); if (hiddenByJsonView(annotations, annotatedType)) { continue; @@ -714,8 +710,8 @@ public Schema resolve(AnnotatedType annotatedType, ModelConverterContext context JavaType propType = member.getType(); if (propType != null && "void".equals(propType.getRawClass().getName())) { - if (member instanceof AnnotatedMethod) { - propType = ((AnnotatedMethod) member).getParameterType(0); + if (member instanceof AnnotatedMethod method) { + propType = method.getParameterType(0); } } @@ -744,8 +740,8 @@ public Schema resolve(AnnotatedType annotatedType, ModelConverterContext context final io.swagger.v3.oas.annotations.media.Schema propResolvedSchemaAnnotation = propSchemaOrArray == null ? null : - propSchemaOrArray instanceof io.swagger.v3.oas.annotations.media.ArraySchema ? - ((io.swagger.v3.oas.annotations.media.ArraySchema) propSchemaOrArray).arraySchema() : + propSchemaOrArray instanceof io.swagger.v3.oas.annotations.media.ArraySchema as1 ? + as1.arraySchema() : (io.swagger.v3.oas.annotations.media.Schema) propSchemaOrArray; io.swagger.v3.oas.annotations.media.Schema.AccessMode accessMode = resolveAccessMode(propDef, type, propResolvedSchemaAnnotation); @@ -876,7 +872,7 @@ public Schema resolve(AnnotatedType annotatedType, ModelConverterContext context } } } - final BeanDescription propBeanDesc = _mapper.getSerializationConfig().introspect(propType); + final BeanDescription propBeanDesc = _mapper._serializationContext().introspectBeanDescription(propType); if (property != null && !propType.isContainerType()) { if (isObjectSchema(property)) { // create a reference for the property @@ -1280,26 +1276,9 @@ private boolean shouldResolveEnumAsRef(io.swagger.v3.oas.annotations.media.Schem } protected Type findJsonValueType(final BeanDescription beanDesc) { - - // use recursion to check for method findJsonValueAccessor existence (Jackson 2.9+) - // if not found use previous deprecated method which could lead to inaccurate result - try { - AnnotatedMember jsonValueMember = invokeMethod(beanDesc, "findJsonValueAccessor"); - if (jsonValueMember != null) { - return jsonValueMember.getType(); - } - return null; - } catch (Exception e) { - LOGGER.warn("jackson BeanDescription.findJsonValueAccessor not found, this could lead to inaccurate result, please update jackson to 2.9+"); - } - - try { - AnnotatedMember jsonValueMember = invokeMethod(beanDesc, "findJsonValueMethod"); - if (jsonValueMember != null) { - return jsonValueMember.getType(); - } - } catch (Exception e) { - LOGGER.error("Neither 'findJsonValueMethod' nor 'findJsonValueAccessor' found in jackson BeanDescription. Please verify your Jackson version."); + AnnotatedMember jsonValueMember = beanDesc.findJsonValueAccessor(); + if (jsonValueMember != null) { + return jsonValueMember.getType(); } return null; } @@ -1309,8 +1288,8 @@ private Schema clone(Schema property) { } private boolean isSubtype(AnnotatedClass childClass, Class parentClass) { - final BeanDescription parentDesc = _mapper.getSerializationConfig().introspectClassAnnotations(parentClass); - List subTypes = _intr().findSubtypes(parentDesc.getClassInfo()); + final AnnotatedClass parentDesc = _mapper._serializationContext().introspectClassAnnotations(parentClass); + List subTypes = _intr().findSubtypes(_mapper.serializationConfig(), parentDesc); if (subTypes == null) { return false; } @@ -1351,8 +1330,8 @@ protected void _addEnumProps(Class propClass, Schema property) { * @param enumClass the enum class for which to add properties */ protected Schema _createSchemaForEnum(Class> enumClass) { - boolean useIndex = _mapper.isEnabled(SerializationFeature.WRITE_ENUMS_USING_INDEX); - boolean useToString = _mapper.isEnabled(SerializationFeature.WRITE_ENUMS_USING_TO_STRING); + boolean useIndex = _mapper.isEnabled(EnumFeature.WRITE_ENUMS_USING_INDEX); + boolean useToString = _mapper.isEnabled(EnumFeature.WRITE_ENUMS_USING_TO_STRING); Optional jsonValueMethod = Arrays.stream(enumClass.getDeclaredMethods()) .filter(m -> m.isAnnotationPresent(JsonValue.class)) @@ -1385,7 +1364,8 @@ protected Schema _createSchemaForEnum(Class> enumClass) { Enum[] enumConstants = enumClass.getEnumConstants(); if (enumConstants != null) { - String[] enumValues = _intr().findEnumValues(enumClass, enumConstants, + AnnotatedClass annotatedClass = _mapper._serializationContext().introspectClassAnnotations(enumClass); + String[] enumValues = _intr().findEnumValues(_mapper.serializationConfig(), annotatedClass, enumConstants, new String[enumConstants.length]); for (Enum en : enumConstants) { @@ -1410,7 +1390,7 @@ protected Schema _createSchemaForEnum(Class> enumClass) { } else if (useToString) { n = en.toString(); } else { - n = _intr().findEnumValue(en); + n = en.name(); } schema.addEnumItemObject(n); } @@ -1492,7 +1472,7 @@ private void handleUnwrapped(List props, Schema innerModel, String prefi Schema clonedProp = Json.mapper().readValue(Json.pretty(prop), Schema.class); clonedProp.setName(prefix + prop.getName() + suffix); props.add(clonedProp); - } catch (IOException e) { + } catch (JacksonException e) { LOGGER.error("Exception cloning property", e); return; } @@ -1544,7 +1524,7 @@ protected Schema processAsId(String propertyName, AnnotatedType type, } else { javaType = mapper.constructType(type.getType()); } - final BeanDescription beanDesc = mapper.getSerializationConfig().introspect(javaType); + final BeanDescription beanDesc = mapper._serializationContext().introspectBeanDescription(javaType); for (BeanPropertyDefinition def : beanDesc.findProperties()) { final String name = def.getName(); if (name != null && name.equals(propertyName)) { @@ -1553,11 +1533,7 @@ protected Schema processAsId(String propertyName, AnnotatedType type, if (PrimitiveType.fromType(propType) != null) { return PrimitiveType.createProperty(propType, openapi31); } else { - List list = new ArrayList<>(); - for (Annotation a : propMember.annotations()) { - list.add(a); - } - Annotation[] annotations = list.toArray(new Annotation[list.size()]); + Annotation[] annotations = propMember.annotations().toArray(Annotation[]::new); AnnotatedType aType = new AnnotatedType() .type(propType) .ctxAnnotations(annotations) @@ -2088,7 +2064,7 @@ protected boolean applyBeanValidatorAnnotationsNoGroups(Schema property, Annotat } private boolean resolveSubtypes(Schema model, BeanDescription bean, ModelConverterContext context, JsonView jsonViewAnnotation) { - final List types = _intr().findSubtypes(bean.getClassInfo()); + final List types = _intr().findSubtypes(_mapper.serializationConfig(), bean.getClassInfo()); if (types == null) { return false; } @@ -2188,8 +2164,8 @@ private void removeSuperClassAndInterfaceSubTypes(List types, BeanDes private void removeSuperSubTypes(List resultTypes, Class superClass) { JavaType superType = _mapper.constructType(superClass); - BeanDescription superBean = _mapper.getSerializationConfig().introspect(superType); - final List superTypes = _intr().findSubtypes(superBean.getClassInfo()); + BeanDescription superBean = _mapper._serializationContext().introspectBeanDescription(superType); + final List superTypes = _intr().findSubtypes(_mapper.serializationConfig(), superBean.getClassInfo()); if (superTypes != null) { resultTypes.removeAll(superTypes); } @@ -2411,7 +2387,7 @@ protected Object resolveDefaultValue(Annotated a, Annotation[] annotations, io.s try { ObjectMapper mapper = ObjectMapperFactory.buildStrictGenericObjectMapper(); return mapper.readTree(schema.defaultValue()); - } catch (IOException e) { + } catch (JacksonException e) { return schema.defaultValue(); } } @@ -2423,8 +2399,8 @@ protected Object resolveDefaultValue(Annotated a, Annotation[] annotations, io.s if (elem == null) { if (annotations != null) { for (Annotation ann : annotations) { - if (ann instanceof XmlElement) { - elem = (XmlElement) ann; + if (ann instanceof XmlElement element) { + elem = element; break; } } @@ -2445,7 +2421,7 @@ protected Object resolveExample(Annotated a, Annotation[] annotations, io.swagge try { ObjectMapper mapper = ObjectMapperFactory.buildStrictGenericObjectMapper(); return mapper.readTree(schema.example()); - } catch (IOException e) { + } catch (JacksonException e) { return schema.example(); } } @@ -2476,8 +2452,8 @@ protected io.swagger.v3.oas.annotations.media.Schema.AccessMode resolveAccessMod return null; } JsonProperty.Access access = null; - if (propDef instanceof POJOPropertyBuilder) { - access = ((POJOPropertyBuilder) propDef).findAccess(); + if (propDef instanceof POJOPropertyBuilder builder) { + access = builder.findAccess(); } boolean hasGetter = propDef.hasGetter(); boolean hasSetter = propDef.hasSetter(); @@ -2485,12 +2461,12 @@ protected io.swagger.v3.oas.annotations.media.Schema.AccessMode resolveAccessMod boolean hasField = propDef.hasField(); if (access == null) { - final BeanDescription beanDesc = _mapper.getDeserializationConfig().introspect(type); + final BeanDescription beanDesc = _mapper._deserializationContext().introspectBeanDescription(type); List properties = beanDesc.findProperties(); for (BeanPropertyDefinition prop : properties) { if (StringUtils.isNotBlank(prop.getInternalName()) && prop.getInternalName().equals(propDef.getInternalName())) { - if (prop instanceof POJOPropertyBuilder) { - access = ((POJOPropertyBuilder) prop).findAccess(); + if (prop instanceof POJOPropertyBuilder builder) { + access = builder.findAccess(); } hasGetter = hasGetter || prop.hasGetter(); hasSetter = hasSetter || prop.hasSetter(); @@ -2803,8 +2779,8 @@ protected XML resolveXml(Annotated a, Annotation[] annotations, io.swagger.v3.oa if (rootAnnotation == null) { if (annotations != null) { for (Annotation ann : annotations) { - if (ann instanceof XmlRootElement) { - rootAnnotation = (XmlRootElement) ann; + if (ann instanceof XmlRootElement element) { + rootAnnotation = element; break; } } @@ -2847,9 +2823,9 @@ protected Set resolveIgnoredProperties(Annotation[] annotations) { Set propertiesToIgnore = new HashSet<>(); if (annotations != null) { for (Annotation annotation : annotations) { - if (annotation instanceof JsonIgnoreProperties) { - if (!((JsonIgnoreProperties) annotation).allowGetters()) { - propertiesToIgnore.addAll(Arrays.asList(((JsonIgnoreProperties) annotation).value())); + if (annotation instanceof JsonIgnoreProperties properties) { + if (!properties.allowGetters()) { + propertiesToIgnore.addAll(Arrays.asList(properties.value())); break; } } @@ -3118,11 +3094,11 @@ protected void resolveSchemaMembers(Schema schema, AnnotatedType annotatedType, final io.swagger.v3.oas.annotations.media.Schema schemaAnnotation = resolvedSchemaOrArrayAnnotation == null ? null : - resolvedSchemaOrArrayAnnotation instanceof io.swagger.v3.oas.annotations.media.ArraySchema ? - ((io.swagger.v3.oas.annotations.media.ArraySchema) resolvedSchemaOrArrayAnnotation).schema() : + resolvedSchemaOrArrayAnnotation instanceof io.swagger.v3.oas.annotations.media.ArraySchema as1 ? + as1.schema() : (io.swagger.v3.oas.annotations.media.Schema) resolvedSchemaOrArrayAnnotation; - final BeanDescription beanDesc = _mapper.getSerializationConfig().introspect(type); + final BeanDescription beanDesc = _mapper._serializationContext().introspectBeanDescription(type); Annotated a = beanDesc.getClassInfo(); Annotation[] annotations = annotatedType.getCtxAnnotations(); resolveSchemaMembers(schema, a, annotations, schemaAnnotation); @@ -3388,14 +3364,12 @@ protected boolean updateRequiredItem(Schema model, String propName) { } protected boolean shouldIgnoreClass(Type type) { - if (type instanceof Class) { - Class cls = (Class) type; + if (type instanceof Class cls) { if (cls.getName().equals("javax.ws.rs.Response")) { return true; } } else { - if (type instanceof com.fasterxml.jackson.core.type.ResolvedType) { - com.fasterxml.jackson.core.type.ResolvedType rt = (com.fasterxml.jackson.core.type.ResolvedType) type; + if (type instanceof tools.jackson.core.type.ResolvedType rt) { LOGGER.trace("Can't check class {}, {}", type, rt.getRawClass().getName()); if (rt.getRawClass().equals(Class.class)) { return true; @@ -3406,8 +3380,8 @@ protected boolean shouldIgnoreClass(Type type) { } private List getIgnoredProperties(BeanDescription beanDescription) { - AnnotationIntrospector introspector = _mapper.getSerializationConfig().getAnnotationIntrospector(); - JsonIgnoreProperties.Value v = introspector.findPropertyIgnorals(beanDescription.getClassInfo()); + AnnotationIntrospector introspector = _mapper.serializationConfig().getAnnotationIntrospector(); + JsonIgnoreProperties.Value v = introspector.findPropertyIgnoralByName(_mapper.serializationConfig(), beanDescription.getClassInfo()); Set ignored = null; if (v != null) { ignored = v.findIgnoredForSerialization(); @@ -3445,9 +3419,9 @@ protected boolean hiddenByJsonView(Annotation[] annotations, Class[] filters = jsonView.value(); boolean containsJsonViewAnnotation = !type.isIncludePropertiesWithoutJSONView(); for (Annotation ant : annotations) { - if (ant instanceof JsonView) { + if (ant instanceof JsonView view) { containsJsonViewAnnotation = true; - Class[] views = ((JsonView) ant).value(); + Class[] views = view.value(); for (Class f : filters) { for (Class v : views) { if (v == f || v.isAssignableFrom(f)) { @@ -3587,11 +3561,6 @@ protected boolean isNumberSchema(Schema schema) { return "number".equals(schema.getType()) || (schema.getTypes() != null && schema.getTypes().contains("number")) || "integer".equals(schema.getType()) || (schema.getTypes() != null && schema.getTypes().contains("integer")); } - private AnnotatedMember invokeMethod(final BeanDescription beanDesc, String methodName) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException { - Method m = BeanDescription.class.getMethod(methodName); - return (AnnotatedMember) m.invoke(beanDesc); - } - protected Schema buildRefSchemaIfObject(Schema schema, ModelConverterContext context) { if (schema == null) { return null; diff --git a/modules/swagger-core/src/main/java/io/swagger/v3/core/jackson/PackageVersion.java b/modules/swagger-core/src/main/java/io/swagger/v3/core/jackson/PackageVersion.java index 515fb7af4f..a9edab1bba 100644 --- a/modules/swagger-core/src/main/java/io/swagger/v3/core/jackson/PackageVersion.java +++ b/modules/swagger-core/src/main/java/io/swagger/v3/core/jackson/PackageVersion.java @@ -1,8 +1,8 @@ package io.swagger.v3.core.jackson; -import com.fasterxml.jackson.core.Version; -import com.fasterxml.jackson.core.Versioned; -import com.fasterxml.jackson.core.util.VersionUtil; +import tools.jackson.core.Version; +import tools.jackson.core.Versioned; +import tools.jackson.core.util.VersionUtil; public final class PackageVersion implements Versioned { public static final Version VERSION = VersionUtil.parseVersion( diff --git a/modules/swagger-core/src/main/java/io/swagger/v3/core/jackson/PathsSerializer.java b/modules/swagger-core/src/main/java/io/swagger/v3/core/jackson/PathsSerializer.java index 414a8e136e..52cf35b0f0 100644 --- a/modules/swagger-core/src/main/java/io/swagger/v3/core/jackson/PathsSerializer.java +++ b/modules/swagger-core/src/main/java/io/swagger/v3/core/jackson/PathsSerializer.java @@ -1,36 +1,37 @@ package io.swagger.v3.core.jackson; -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 io.swagger.v3.oas.models.PathItem; import io.swagger.v3.oas.models.Paths; +import tools.jackson.databind.SerializationContext; +import tools.jackson.databind.ValueSerializer; import java.io.IOException; import java.util.Map.Entry; -public class PathsSerializer extends JsonSerializer { +public class PathsSerializer extends ValueSerializer { @Override public void serialize( - Paths value, JsonGenerator jgen, SerializerProvider provider) - throws IOException { + Paths value, JsonGenerator jgen, SerializationContext provider) + throws JacksonException { if (value != null && value.getExtensions() != null && !value.getExtensions().isEmpty()) { jgen.writeStartObject(); if (!value.isEmpty()) { for (Entry entry: value.entrySet()) { - jgen.writeObjectField(entry.getKey() , entry.getValue()); + jgen.writePOJOProperty(entry.getKey() , entry.getValue()); } } for (Entry entry: value.getExtensions().entrySet()) { - jgen.writeObjectField(entry.getKey() , entry.getValue()); + jgen.writePOJOProperty(entry.getKey() , entry.getValue()); } jgen.writeEndObject(); } else { - provider.defaultSerializeValue(value, jgen); + jgen.writePOJO(value); } } } diff --git a/modules/swagger-core/src/main/java/io/swagger/v3/core/jackson/Schema31Serializer.java b/modules/swagger-core/src/main/java/io/swagger/v3/core/jackson/Schema31Serializer.java index 47d380454c..cabbf5a126 100644 --- a/modules/swagger-core/src/main/java/io/swagger/v3/core/jackson/Schema31Serializer.java +++ b/modules/swagger-core/src/main/java/io/swagger/v3/core/jackson/Schema31Serializer.java @@ -1,33 +1,29 @@ package io.swagger.v3.core.jackson; -import com.fasterxml.jackson.core.JsonGenerator; -import com.fasterxml.jackson.databind.JsonMappingException; -import com.fasterxml.jackson.databind.JsonSerializer; -import com.fasterxml.jackson.databind.SerializerProvider; -import com.fasterxml.jackson.databind.ser.ResolvableSerializer; +import tools.jackson.core.JacksonException; +import tools.jackson.core.JsonGenerator; import io.swagger.v3.oas.models.media.Schema; +import tools.jackson.databind.DatabindException; +import tools.jackson.databind.SerializationContext; +import tools.jackson.databind.ValueSerializer; -import java.io.IOException; +public class Schema31Serializer extends ValueSerializer { -public class Schema31Serializer extends JsonSerializer implements ResolvableSerializer { + private ValueSerializer defaultSerializer; - private JsonSerializer defaultSerializer; - - public Schema31Serializer(JsonSerializer serializer) { + public Schema31Serializer(ValueSerializer serializer) { defaultSerializer = serializer; } @Override - public void resolve(SerializerProvider serializerProvider) throws JsonMappingException { - if (defaultSerializer instanceof ResolvableSerializer) { - ((ResolvableSerializer) defaultSerializer).resolve(serializerProvider); - } + public void resolve(SerializationContext serializerProvider) throws DatabindException { + defaultSerializer.resolve(serializerProvider); } @Override public void serialize( - Schema value, JsonGenerator jgen, SerializerProvider provider) - throws IOException { + Schema value, JsonGenerator jgen, SerializationContext provider) + throws JacksonException { if (value.getBooleanSchemaValue() != null) { jgen.writeBoolean(value.getBooleanSchemaValue()); @@ -36,7 +32,7 @@ public void serialize( if (value.getExampleSetFlag() && value.getExample() == null) { jgen.writeStartObject(); defaultSerializer.unwrappingSerializer(null).serialize(value, jgen, provider); - jgen.writeNullField("example"); + jgen.writeNullProperty("example"); jgen.writeEndObject(); } else { defaultSerializer.serialize(value, jgen, provider); diff --git a/modules/swagger-core/src/main/java/io/swagger/v3/core/jackson/SchemaSerializer.java b/modules/swagger-core/src/main/java/io/swagger/v3/core/jackson/SchemaSerializer.java index 95ac91c7b2..303cf1f9d5 100644 --- a/modules/swagger-core/src/main/java/io/swagger/v3/core/jackson/SchemaSerializer.java +++ b/modules/swagger-core/src/main/java/io/swagger/v3/core/jackson/SchemaSerializer.java @@ -1,41 +1,37 @@ package io.swagger.v3.core.jackson; -import com.fasterxml.jackson.core.JsonGenerator; -import com.fasterxml.jackson.databind.JsonMappingException; -import com.fasterxml.jackson.databind.JsonSerializer; -import com.fasterxml.jackson.databind.SerializerProvider; -import com.fasterxml.jackson.databind.ser.ResolvableSerializer; +import tools.jackson.core.JacksonException; +import tools.jackson.core.JsonGenerator; import io.swagger.v3.oas.models.media.Schema; import org.apache.commons.lang3.StringUtils; +import tools.jackson.databind.DatabindException; +import tools.jackson.databind.SerializationContext; +import tools.jackson.databind.ValueSerializer; -import java.io.IOException; +public class SchemaSerializer extends ValueSerializer { -public class SchemaSerializer extends JsonSerializer implements ResolvableSerializer { + private ValueSerializer defaultSerializer; - private JsonSerializer defaultSerializer; - - public SchemaSerializer(JsonSerializer serializer) { + public SchemaSerializer(ValueSerializer serializer) { defaultSerializer = serializer; } @Override - public void resolve(SerializerProvider serializerProvider) throws JsonMappingException { - if (defaultSerializer instanceof ResolvableSerializer) { - ((ResolvableSerializer) defaultSerializer).resolve(serializerProvider); - } + public void resolve(SerializationContext serializerProvider) throws DatabindException { + defaultSerializer.resolve(serializerProvider); } @Override public void serialize( - Schema value, JsonGenerator jgen, SerializerProvider provider) - throws IOException { + Schema value, JsonGenerator jgen, SerializationContext provider) + throws JacksonException { if (StringUtils.isBlank(value.get$ref())) { if (value.getExampleSetFlag() && value.getExample() == null) { jgen.writeStartObject(); defaultSerializer.unwrappingSerializer(null).serialize(value, jgen, provider); - jgen.writeNullField("example"); + jgen.writeNullProperty("example"); jgen.writeEndObject(); } else { defaultSerializer.serialize(value, jgen, provider); @@ -44,7 +40,7 @@ public void serialize( } else { // handle ref schema serialization skipping all other props jgen.writeStartObject(); - jgen.writeStringField("$ref", value.get$ref()); + jgen.writeStringProperty("$ref", value.get$ref()); jgen.writeEndObject(); } } diff --git a/modules/swagger-core/src/main/java/io/swagger/v3/core/jackson/SwaggerAnnotationIntrospector.java b/modules/swagger-core/src/main/java/io/swagger/v3/core/jackson/SwaggerAnnotationIntrospector.java index 2b44610a4a..8f5e48f540 100644 --- a/modules/swagger-core/src/main/java/io/swagger/v3/core/jackson/SwaggerAnnotationIntrospector.java +++ b/modules/swagger-core/src/main/java/io/swagger/v3/core/jackson/SwaggerAnnotationIntrospector.java @@ -1,12 +1,13 @@ package io.swagger.v3.core.jackson; import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.core.Version; -import com.fasterxml.jackson.databind.AnnotationIntrospector; -import com.fasterxml.jackson.databind.introspect.Annotated; -import com.fasterxml.jackson.databind.introspect.AnnotatedClass; -import com.fasterxml.jackson.databind.introspect.AnnotatedMember; -import com.fasterxml.jackson.databind.jsontype.NamedType; +import tools.jackson.core.Version; +import tools.jackson.databind.AnnotationIntrospector; +import tools.jackson.databind.cfg.MapperConfig; +import tools.jackson.databind.introspect.Annotated; +import tools.jackson.databind.introspect.AnnotatedClass; +import tools.jackson.databind.introspect.AnnotatedMember; +import tools.jackson.databind.jsontype.NamedType; import io.swagger.v3.core.util.AnnotationsUtils; import io.swagger.v3.oas.annotations.media.ArraySchema; import io.swagger.v3.oas.annotations.media.Schema; @@ -25,7 +26,7 @@ public Version version() { } @Override - public Boolean hasRequiredMarker(AnnotatedMember m) { + public Boolean hasRequiredMarker(MapperConfig config, AnnotatedMember m) { XmlElement elem = m.getAnnotation(XmlElement.class); if (elem != null) { if (elem.required()) { @@ -57,7 +58,7 @@ public Boolean hasRequiredMarker(AnnotatedMember m) { } @Override - public String findPropertyDescription(Annotated a) { + public String findPropertyDescription(MapperConfig config, Annotated a) { Schema model = a.getAnnotation(Schema.class); if (model != null && !"".equals(model.description())) { return model.description(); @@ -67,7 +68,7 @@ public String findPropertyDescription(Annotated a) { } @Override - public List findSubtypes(Annotated a) { + public List findSubtypes(MapperConfig config, Annotated a) { Schema schema = a.getAnnotation(Schema.class); if (schema == null) { final ArraySchema arraySchema = a.getAnnotation(ArraySchema.class); @@ -91,7 +92,7 @@ public List findSubtypes(Annotated a) { } @Override - public String findTypeName(AnnotatedClass ac) { + public String findTypeName(MapperConfig config, AnnotatedClass ac) { io.swagger.v3.oas.annotations.media.Schema mp = AnnotationsUtils.getSchemaAnnotation(ac); // allow override of name from annotation if (mp != null && !mp.name().isEmpty()) { diff --git a/modules/swagger-core/src/main/java/io/swagger/v3/core/jackson/SwaggerModule.java b/modules/swagger-core/src/main/java/io/swagger/v3/core/jackson/SwaggerModule.java index 695391a031..c8de25810b 100644 --- a/modules/swagger-core/src/main/java/io/swagger/v3/core/jackson/SwaggerModule.java +++ b/modules/swagger-core/src/main/java/io/swagger/v3/core/jackson/SwaggerModule.java @@ -1,6 +1,6 @@ package io.swagger.v3.core.jackson; -import com.fasterxml.jackson.databind.module.SimpleModule; +import tools.jackson.databind.module.SimpleModule; public class SwaggerModule extends SimpleModule { private static final long serialVersionUID = 1L; diff --git a/modules/swagger-core/src/main/java/io/swagger/v3/core/jackson/TypeNameResolver.java b/modules/swagger-core/src/main/java/io/swagger/v3/core/jackson/TypeNameResolver.java index 0f60413515..7509d83317 100644 --- a/modules/swagger-core/src/main/java/io/swagger/v3/core/jackson/TypeNameResolver.java +++ b/modules/swagger-core/src/main/java/io/swagger/v3/core/jackson/TypeNameResolver.java @@ -1,6 +1,6 @@ package io.swagger.v3.core.jackson; -import com.fasterxml.jackson.databind.JavaType; +import tools.jackson.databind.JavaType; import io.swagger.v3.core.util.AnnotationsUtils; import io.swagger.v3.core.util.PrimitiveType; import org.apache.commons.lang3.StringUtils; diff --git a/modules/swagger-core/src/main/java/io/swagger/v3/core/jackson/mixin/Components31Mixin.java b/modules/swagger-core/src/main/java/io/swagger/v3/core/jackson/mixin/Components31Mixin.java index 71945ebeec..5094a8d504 100644 --- a/modules/swagger-core/src/main/java/io/swagger/v3/core/jackson/mixin/Components31Mixin.java +++ b/modules/swagger-core/src/main/java/io/swagger/v3/core/jackson/mixin/Components31Mixin.java @@ -2,7 +2,7 @@ import com.fasterxml.jackson.annotation.JsonAnyGetter; import com.fasterxml.jackson.annotation.JsonAnySetter; -import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import tools.jackson.databind.annotation.JsonSerialize; import io.swagger.v3.core.jackson.CallbackSerializer; import io.swagger.v3.oas.models.callbacks.Callback; diff --git a/modules/swagger-core/src/main/java/io/swagger/v3/core/jackson/mixin/ComponentsMixin.java b/modules/swagger-core/src/main/java/io/swagger/v3/core/jackson/mixin/ComponentsMixin.java index ec6423126b..9ccfc9802f 100644 --- a/modules/swagger-core/src/main/java/io/swagger/v3/core/jackson/mixin/ComponentsMixin.java +++ b/modules/swagger-core/src/main/java/io/swagger/v3/core/jackson/mixin/ComponentsMixin.java @@ -3,7 +3,7 @@ import com.fasterxml.jackson.annotation.JsonAnyGetter; import com.fasterxml.jackson.annotation.JsonAnySetter; import com.fasterxml.jackson.annotation.JsonIgnore; -import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import tools.jackson.databind.annotation.JsonSerialize; import io.swagger.v3.core.jackson.CallbackSerializer; import io.swagger.v3.oas.models.PathItem; import io.swagger.v3.oas.models.callbacks.Callback; diff --git a/modules/swagger-core/src/main/java/io/swagger/v3/core/jackson/mixin/OpenAPI31Mixin.java b/modules/swagger-core/src/main/java/io/swagger/v3/core/jackson/mixin/OpenAPI31Mixin.java index 96add18b36..3a2d59093b 100644 --- a/modules/swagger-core/src/main/java/io/swagger/v3/core/jackson/mixin/OpenAPI31Mixin.java +++ b/modules/swagger-core/src/main/java/io/swagger/v3/core/jackson/mixin/OpenAPI31Mixin.java @@ -2,7 +2,7 @@ import com.fasterxml.jackson.annotation.JsonAnyGetter; import com.fasterxml.jackson.annotation.JsonAnySetter; -import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import tools.jackson.databind.annotation.JsonSerialize; import io.swagger.v3.core.jackson.PathsSerializer; import io.swagger.v3.oas.models.Paths; diff --git a/modules/swagger-core/src/main/java/io/swagger/v3/core/jackson/mixin/OpenAPIMixin.java b/modules/swagger-core/src/main/java/io/swagger/v3/core/jackson/mixin/OpenAPIMixin.java index d495abf326..a61374c663 100644 --- a/modules/swagger-core/src/main/java/io/swagger/v3/core/jackson/mixin/OpenAPIMixin.java +++ b/modules/swagger-core/src/main/java/io/swagger/v3/core/jackson/mixin/OpenAPIMixin.java @@ -4,7 +4,7 @@ import com.fasterxml.jackson.annotation.JsonAnySetter; import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import tools.jackson.databind.annotation.JsonSerialize; import io.swagger.v3.core.jackson.PathsSerializer; import io.swagger.v3.oas.models.PathItem; import io.swagger.v3.oas.models.Paths; diff --git a/modules/swagger-core/src/main/java/io/swagger/v3/core/jackson/mixin/OperationMixin.java b/modules/swagger-core/src/main/java/io/swagger/v3/core/jackson/mixin/OperationMixin.java index 788b845f4b..5978eea684 100644 --- a/modules/swagger-core/src/main/java/io/swagger/v3/core/jackson/mixin/OperationMixin.java +++ b/modules/swagger-core/src/main/java/io/swagger/v3/core/jackson/mixin/OperationMixin.java @@ -2,7 +2,7 @@ import com.fasterxml.jackson.annotation.JsonAnyGetter; import com.fasterxml.jackson.annotation.JsonAnySetter; -import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import tools.jackson.databind.annotation.JsonSerialize; import io.swagger.v3.core.jackson.ApiResponsesSerializer; import io.swagger.v3.core.jackson.CallbackSerializer; import io.swagger.v3.oas.models.callbacks.Callback; diff --git a/modules/swagger-core/src/main/java/io/swagger/v3/core/jackson/mixin/Schema31Mixin.java b/modules/swagger-core/src/main/java/io/swagger/v3/core/jackson/mixin/Schema31Mixin.java index 782ae13225..f763ed8f95 100644 --- a/modules/swagger-core/src/main/java/io/swagger/v3/core/jackson/mixin/Schema31Mixin.java +++ b/modules/swagger-core/src/main/java/io/swagger/v3/core/jackson/mixin/Schema31Mixin.java @@ -6,10 +6,11 @@ import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonPropertyOrder; -import com.fasterxml.jackson.core.JsonGenerator; -import com.fasterxml.jackson.databind.JsonSerializer; -import com.fasterxml.jackson.databind.SerializerProvider; -import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import tools.jackson.core.JacksonException; +import tools.jackson.core.JsonGenerator; +import tools.jackson.databind.annotation.JsonSerialize; +import tools.jackson.databind.SerializationContext; +import tools.jackson.databind.ValueSerializer; import java.io.IOException; import java.math.BigDecimal; @@ -62,10 +63,10 @@ public abstract class Schema31Mixin { @JsonIgnore public abstract Boolean getBooleanSchemaValue(); - public static class TypeSerializer extends JsonSerializer> { + public static class TypeSerializer extends ValueSerializer> { @Override - public void serialize(Set types, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException { + public void serialize(Set types, JsonGenerator jsonGenerator, SerializationContext serializerProvider) throws JacksonException { if (types != null && types.size() == 1) { jsonGenerator.writeString((String)types.toArray()[0]); } else if (types != null && types.size() > 1){ diff --git a/modules/swagger-core/src/main/java/io/swagger/v3/core/util/AnnotationsUtils.java b/modules/swagger-core/src/main/java/io/swagger/v3/core/util/AnnotationsUtils.java index e331732722..7bebfcc5d9 100644 --- a/modules/swagger-core/src/main/java/io/swagger/v3/core/util/AnnotationsUtils.java +++ b/modules/swagger-core/src/main/java/io/swagger/v3/core/util/AnnotationsUtils.java @@ -1,10 +1,11 @@ package io.swagger.v3.core.util; import com.fasterxml.jackson.annotation.JsonView; -import com.fasterxml.jackson.databind.JavaType; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.introspect.Annotated; +import tools.jackson.core.JacksonException; +import tools.jackson.databind.JavaType; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.ObjectMapper; +import tools.jackson.databind.introspect.Annotated; import io.swagger.v3.core.converter.AnnotatedType; import io.swagger.v3.core.converter.ModelConverterContext; import io.swagger.v3.core.converter.ModelConverters; @@ -455,7 +456,7 @@ private static boolean resolveExample(Example exampleObject, ExampleObject examp try { ObjectMapper mapper = ObjectMapperFactory.buildStrictGenericObjectMapper(); exampleObject.setValue(mapper.readTree(example.value())); - } catch (IOException e) { + } catch (JacksonException e) { exampleObject.setValue(example.value()); } } @@ -719,7 +720,7 @@ public static Optional getSchemaFromAnnotation( _const = Json.mapper().readTree(schema._const()); } schemaObject.setConst(_const); - } catch (IOException e) { + } catch (JacksonException e) { schemaObject.setConst(schema._const()); } } @@ -771,7 +772,7 @@ public static Optional getSchemaFromAnnotation( } else { schemaObject.setExample(Json.mapper().readTree(schema.example())); } - } catch (IOException e) { + } catch (JacksonException e) { schemaObject.setExample(schema.example()); } } @@ -1381,7 +1382,7 @@ public static Optional
getHeader(io.swagger.v3.oas.annotations.headers.H if (StringUtils.isNotBlank(header.example())) { try { headerObject.setExample(Json.mapper().readTree(header.example())); - } catch (IOException e) { + } catch (JacksonException e) { headerObject.setExample(header.example()); } } @@ -1574,7 +1575,7 @@ public static Schema clone(Schema schema, boolean openapi31) { schema = Json.mapper().readValue(Json.pretty(schema), Schema.class); } schema.setName(cloneName); - } catch (IOException e) { + } catch (JacksonException e) { LOGGER.error("Could not clone schema", e); } return schema; diff --git a/modules/swagger-core/src/main/java/io/swagger/v3/core/util/ApiResponsesDeserializer.java b/modules/swagger-core/src/main/java/io/swagger/v3/core/util/ApiResponsesDeserializer.java index cbf21a1a9e..12a05a17d0 100644 --- a/modules/swagger-core/src/main/java/io/swagger/v3/core/util/ApiResponsesDeserializer.java +++ b/modules/swagger-core/src/main/java/io/swagger/v3/core/util/ApiResponsesDeserializer.java @@ -1,26 +1,27 @@ package io.swagger.v3.core.util; -import com.fasterxml.jackson.core.JsonParser; -import com.fasterxml.jackson.databind.DeserializationContext; -import com.fasterxml.jackson.databind.JsonDeserializer; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.node.ObjectNode; +import tools.jackson.core.JacksonException; +import tools.jackson.core.JsonParser; +import tools.jackson.databind.DeserializationContext; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.ObjectMapper; +import tools.jackson.databind.node.ObjectNode; import io.swagger.v3.oas.models.responses.ApiResponse; import io.swagger.v3.oas.models.responses.ApiResponses; +import tools.jackson.databind.ValueDeserializer; import java.io.IOException; import java.util.Iterator; import java.util.LinkedHashMap; import java.util.Map; -public class ApiResponsesDeserializer extends JsonDeserializer { +public class ApiResponsesDeserializer extends ValueDeserializer { protected boolean openapi31; @Override public ApiResponses deserialize(JsonParser jp, DeserializationContext ctxt) - throws IOException { + throws JacksonException { final ObjectMapper mapper; if (openapi31) { @@ -29,12 +30,12 @@ public ApiResponses deserialize(JsonParser jp, DeserializationContext ctxt) mapper = Json.mapper(); } ApiResponses result = new ApiResponses(); - JsonNode node = jp.getCodec().readTree(jp); + JsonNode node = jp.objectReadContext().readTree(jp); ObjectNode objectNode = (ObjectNode) node; Map extensions = new LinkedHashMap<>(); - for (Iterator it = objectNode.fieldNames(); it.hasNext(); ) { - String childName = it.next(); - JsonNode child = objectNode.get(childName); + for (Map.Entry entry : objectNode.properties()) { + String childName = entry.getKey(); + JsonNode child = entry.getValue(); // if name start with `x-` consider it an extension if (childName.startsWith("x-")) { extensions.put(childName, mapper.convertValue(child, Object.class)); diff --git a/modules/swagger-core/src/main/java/io/swagger/v3/core/util/CallbackDeserializer.java b/modules/swagger-core/src/main/java/io/swagger/v3/core/util/CallbackDeserializer.java index 1fc2c3ec92..2360920ec8 100644 --- a/modules/swagger-core/src/main/java/io/swagger/v3/core/util/CallbackDeserializer.java +++ b/modules/swagger-core/src/main/java/io/swagger/v3/core/util/CallbackDeserializer.java @@ -1,26 +1,28 @@ package io.swagger.v3.core.util; -import com.fasterxml.jackson.core.JsonParser; -import com.fasterxml.jackson.databind.DeserializationContext; -import com.fasterxml.jackson.databind.JsonDeserializer; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.node.ObjectNode; +import tools.jackson.core.JacksonException; +import tools.jackson.core.JsonParser; +import tools.jackson.databind.DeserializationContext; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.ObjectMapper; +import tools.jackson.databind.node.ObjectNode; import io.swagger.v3.oas.models.PathItem; import io.swagger.v3.oas.models.callbacks.Callback; +import tools.jackson.databind.ValueDeserializer; import java.io.IOException; import java.util.Iterator; import java.util.LinkedHashMap; import java.util.Map; +import java.util.Set; -public class CallbackDeserializer extends JsonDeserializer { +public class CallbackDeserializer extends ValueDeserializer { protected boolean openapi31; @Override public Callback deserialize(JsonParser jp, DeserializationContext ctxt) - throws IOException { + throws JacksonException { final ObjectMapper mapper; if (openapi31) { @@ -29,17 +31,17 @@ public Callback deserialize(JsonParser jp, DeserializationContext ctxt) mapper = Json.mapper(); } Callback result = new Callback(); - JsonNode node = jp.getCodec().readTree(jp); + JsonNode node = jp.objectReadContext().readTree(jp); ObjectNode objectNode = (ObjectNode)node; Map extensions = new LinkedHashMap<>(); - for (Iterator it = objectNode.fieldNames(); it.hasNext(); ) { - String childName = it.next(); - JsonNode child = objectNode.get(childName); + for (Map.Entry entry : objectNode.properties()) { + String childName = entry.getKey(); + JsonNode child = entry.getValue(); // if name start with `x-` consider it an extension if (childName.startsWith("x-")) { extensions.put(childName, mapper.convertValue(child, Object.class)); } else if (childName.equals("$ref")) { - result.$ref(child.asText()); + result.$ref(child.asString()); } else { result.put(childName, mapper.convertValue(child, PathItem.class)); } diff --git a/modules/swagger-core/src/main/java/io/swagger/v3/core/util/DeserializationModule.java b/modules/swagger-core/src/main/java/io/swagger/v3/core/util/DeserializationModule.java index b5e14d5d29..3625c07074 100644 --- a/modules/swagger-core/src/main/java/io/swagger/v3/core/util/DeserializationModule.java +++ b/modules/swagger-core/src/main/java/io/swagger/v3/core/util/DeserializationModule.java @@ -1,6 +1,6 @@ package io.swagger.v3.core.util; -import com.fasterxml.jackson.databind.module.SimpleModule; +import tools.jackson.databind.module.SimpleModule; import io.swagger.v3.oas.models.Paths; import io.swagger.v3.oas.models.callbacks.Callback; import io.swagger.v3.oas.models.headers.Header; diff --git a/modules/swagger-core/src/main/java/io/swagger/v3/core/util/DeserializationModule31.java b/modules/swagger-core/src/main/java/io/swagger/v3/core/util/DeserializationModule31.java index 1657c5f7b9..846cf05d52 100644 --- a/modules/swagger-core/src/main/java/io/swagger/v3/core/util/DeserializationModule31.java +++ b/modules/swagger-core/src/main/java/io/swagger/v3/core/util/DeserializationModule31.java @@ -1,10 +1,9 @@ package io.swagger.v3.core.util; -import com.fasterxml.jackson.databind.BeanDescription; -import com.fasterxml.jackson.databind.DeserializationConfig; -import com.fasterxml.jackson.databind.JsonDeserializer; -import com.fasterxml.jackson.databind.deser.BeanDeserializerModifier; -import com.fasterxml.jackson.databind.module.SimpleModule; +import tools.jackson.databind.BeanDescription; +import tools.jackson.databind.DeserializationConfig; +import tools.jackson.databind.deser.ValueDeserializerModifier; +import tools.jackson.databind.module.SimpleModule; import io.swagger.v3.oas.models.OpenAPI; import io.swagger.v3.oas.models.Paths; import io.swagger.v3.oas.models.callbacks.Callback; @@ -15,6 +14,7 @@ import io.swagger.v3.oas.models.parameters.Parameter; import io.swagger.v3.oas.models.responses.ApiResponses; import io.swagger.v3.oas.models.security.SecurityScheme; +import tools.jackson.databind.ValueDeserializer; public class DeserializationModule31 extends SimpleModule { @@ -32,10 +32,10 @@ public DeserializationModule31() { this.addDeserializer(Paths.class, new Paths31Deserializer()); this.addDeserializer(Callback.class, new Callback31Deserializer()); - this.setDeserializerModifier(new BeanDeserializerModifier() + this.setDeserializerModifier(new ValueDeserializerModifier() { - @Override public JsonDeserializer modifyDeserializer(DeserializationConfig config, BeanDescription beanDesc, JsonDeserializer deserializer) { - if (beanDesc.getBeanClass() == OpenAPI.class) { + @Override public ValueDeserializer modifyDeserializer(DeserializationConfig config, BeanDescription.Supplier beanDescRef, ValueDeserializer deserializer) { + if (beanDescRef.getBeanClass() == OpenAPI.class) { return new OpenAPI31Deserializer(deserializer); } return deserializer; diff --git a/modules/swagger-core/src/main/java/io/swagger/v3/core/util/EncodingPropertyStyleEnumDeserializer.java b/modules/swagger-core/src/main/java/io/swagger/v3/core/util/EncodingPropertyStyleEnumDeserializer.java index 37891e6c57..5d89d5d9e4 100644 --- a/modules/swagger-core/src/main/java/io/swagger/v3/core/util/EncodingPropertyStyleEnumDeserializer.java +++ b/modules/swagger-core/src/main/java/io/swagger/v3/core/util/EncodingPropertyStyleEnumDeserializer.java @@ -1,22 +1,23 @@ package io.swagger.v3.core.util; -import com.fasterxml.jackson.core.JsonParser; -import com.fasterxml.jackson.databind.DeserializationContext; -import com.fasterxml.jackson.databind.JsonDeserializer; -import com.fasterxml.jackson.databind.JsonNode; +import tools.jackson.core.JacksonException; +import tools.jackson.core.JsonParser; +import tools.jackson.databind.DeserializationContext; +import tools.jackson.databind.JsonNode; import io.swagger.v3.oas.models.media.EncodingProperty; +import tools.jackson.databind.ValueDeserializer; import java.io.IOException; import java.util.Arrays; import java.util.stream.Collectors; -public class EncodingPropertyStyleEnumDeserializer extends JsonDeserializer { +public class EncodingPropertyStyleEnumDeserializer extends ValueDeserializer { @Override public EncodingProperty.StyleEnum deserialize(JsonParser jp, DeserializationContext ctxt) - throws IOException { - JsonNode node = jp.getCodec().readTree(jp); + throws JacksonException { + JsonNode node = jp.objectReadContext().readTree(jp); if (node != null) { - String value = node.asText(); + String value = node.asString(); return getStyleEnum(value); } return null; diff --git a/modules/swagger-core/src/main/java/io/swagger/v3/core/util/EncodingStyleEnumDeserializer.java b/modules/swagger-core/src/main/java/io/swagger/v3/core/util/EncodingStyleEnumDeserializer.java index f5f4d5bb86..1676452cb4 100644 --- a/modules/swagger-core/src/main/java/io/swagger/v3/core/util/EncodingStyleEnumDeserializer.java +++ b/modules/swagger-core/src/main/java/io/swagger/v3/core/util/EncodingStyleEnumDeserializer.java @@ -1,22 +1,23 @@ package io.swagger.v3.core.util; -import com.fasterxml.jackson.core.JsonParser; -import com.fasterxml.jackson.databind.DeserializationContext; -import com.fasterxml.jackson.databind.JsonDeserializer; -import com.fasterxml.jackson.databind.JsonNode; +import tools.jackson.core.JacksonException; +import tools.jackson.core.JsonParser; +import tools.jackson.databind.DeserializationContext; +import tools.jackson.databind.JsonNode; import io.swagger.v3.oas.models.media.Encoding; +import tools.jackson.databind.ValueDeserializer; import java.io.IOException; import java.util.Arrays; import java.util.stream.Collectors; -public class EncodingStyleEnumDeserializer extends JsonDeserializer { +public class EncodingStyleEnumDeserializer extends ValueDeserializer { @Override public Encoding.StyleEnum deserialize(JsonParser jp, DeserializationContext ctxt) - throws IOException { - JsonNode node = jp.getCodec().readTree(jp); + throws JacksonException { + JsonNode node = jp.objectReadContext().readTree(jp); if (node != null) { - String value = node.asText(); + String value = node.asString(); return getStyleEnum(value); } return null; diff --git a/modules/swagger-core/src/main/java/io/swagger/v3/core/util/HeaderStyleEnumDeserializer.java b/modules/swagger-core/src/main/java/io/swagger/v3/core/util/HeaderStyleEnumDeserializer.java index d7f27ef70c..0ffd9874eb 100644 --- a/modules/swagger-core/src/main/java/io/swagger/v3/core/util/HeaderStyleEnumDeserializer.java +++ b/modules/swagger-core/src/main/java/io/swagger/v3/core/util/HeaderStyleEnumDeserializer.java @@ -1,22 +1,23 @@ package io.swagger.v3.core.util; -import com.fasterxml.jackson.core.JsonParser; -import com.fasterxml.jackson.databind.DeserializationContext; -import com.fasterxml.jackson.databind.JsonDeserializer; -import com.fasterxml.jackson.databind.JsonNode; +import tools.jackson.core.JacksonException; +import tools.jackson.core.JsonParser; +import tools.jackson.databind.DeserializationContext; +import tools.jackson.databind.JsonNode; import io.swagger.v3.oas.models.headers.Header; +import tools.jackson.databind.ValueDeserializer; import java.io.IOException; import java.util.Arrays; import java.util.stream.Collectors; -public class HeaderStyleEnumDeserializer extends JsonDeserializer { +public class HeaderStyleEnumDeserializer extends ValueDeserializer { @Override public Header.StyleEnum deserialize(JsonParser jp, DeserializationContext ctxt) - throws IOException { - JsonNode node = jp.getCodec().readTree(jp); + throws JacksonException { + JsonNode node = jp.objectReadContext().readTree(jp); if (node != null) { - String value = node.asText(); + String value = node.asString(); return getStyleEnum(value); } return null; diff --git a/modules/swagger-core/src/main/java/io/swagger/v3/core/util/Json.java b/modules/swagger-core/src/main/java/io/swagger/v3/core/util/Json.java index 055d31a4eb..2e8362a845 100644 --- a/modules/swagger-core/src/main/java/io/swagger/v3/core/util/Json.java +++ b/modules/swagger-core/src/main/java/io/swagger/v3/core/util/Json.java @@ -1,10 +1,13 @@ package io.swagger.v3.core.util; -import com.fasterxml.jackson.core.util.DefaultPrettyPrinter; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.ObjectWriter; +import tools.jackson.core.util.DefaultPrettyPrinter; +import tools.jackson.databind.ObjectMapper; +import tools.jackson.databind.ObjectWriter; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import tools.jackson.databind.cfg.MapperBuilder; + +import java.util.function.Consumer; public class Json { @@ -18,8 +21,12 @@ public static ObjectMapper mapper() { return ObjectMapperHolder.MAPPER; } + public static ObjectMapper mapper(Consumer>> mapperBuilderCustomizer) { + return ObjectMapperFactory.createJson(mapperBuilderCustomizer); + } + public static ObjectWriter pretty() { - return mapper().writer(new DefaultPrettyPrinter()); + return mapper().writerWithDefaultPrettyPrinter(); } public static String pretty(Object o) { diff --git a/modules/swagger-core/src/main/java/io/swagger/v3/core/util/Json31.java b/modules/swagger-core/src/main/java/io/swagger/v3/core/util/Json31.java index 64b7600b89..a348ea00fe 100644 --- a/modules/swagger-core/src/main/java/io/swagger/v3/core/util/Json31.java +++ b/modules/swagger-core/src/main/java/io/swagger/v3/core/util/Json31.java @@ -1,15 +1,17 @@ package io.swagger.v3.core.util; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.core.util.DefaultPrettyPrinter; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.ObjectWriter; +import tools.jackson.core.util.DefaultPrettyPrinter; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.ObjectMapper; +import tools.jackson.databind.ObjectWriter; import io.swagger.v3.oas.models.media.Schema; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import tools.jackson.core.JacksonException; +import tools.jackson.databind.cfg.MapperBuilder; import java.util.Map; +import java.util.function.Consumer; public class Json31 { @@ -27,12 +29,16 @@ public static ObjectMapper mapper() { return ObjectMapperHolder.MAPPER; } + public static ObjectMapper mapper(Consumer>> mapperBuilderCustomizer) { + return ObjectMapperFactory.createJson31(mapperBuilderCustomizer); + } + public static ObjectMapper converterMapper() { return ConverterMapperHolder.MAPPER; } public static ObjectWriter pretty() { - return mapper().writer(new DefaultPrettyPrinter()); + return mapper().writerWithDefaultPrettyPrinter(); } public static String pretty(Object o) { @@ -56,7 +62,7 @@ public static void prettyPrint(Object o) { public static Map jsonSchemaAsMap(String jsonSchema) { try { return mapper().readValue(jsonSchema, Map.class); - } catch (JsonProcessingException e) { + } catch (JacksonException e) { LOGGER.error("Exception converting jsonSchema to Map", e); return null; } @@ -65,7 +71,7 @@ public static Map jsonSchemaAsMap(String jsonSchema) { public static Map jsonSchemaAsMap(Schema schema) { try { return mapper().readValue(mapper().writeValueAsString(schema), Map.class); - } catch (JsonProcessingException e) { + } catch (JacksonException e) { LOGGER.error("Exception converting jsonSchema to Map", e); return null; } @@ -74,7 +80,7 @@ public static Map jsonSchemaAsMap(Schema schema) { public static Map jsonSchemaAsMap(JsonNode schema) { try { return mapper().readValue(mapper().writeValueAsString(schema), Map.class); - } catch (JsonProcessingException e) { + } catch (JacksonException e) { LOGGER.error("Exception converting jsonSchema to Map", e); return null; } diff --git a/modules/swagger-core/src/main/java/io/swagger/v3/core/util/ModelDeserializer.java b/modules/swagger-core/src/main/java/io/swagger/v3/core/util/ModelDeserializer.java index d2f232e4be..0bd0b4279b 100644 --- a/modules/swagger-core/src/main/java/io/swagger/v3/core/util/ModelDeserializer.java +++ b/modules/swagger-core/src/main/java/io/swagger/v3/core/util/ModelDeserializer.java @@ -1,12 +1,11 @@ package io.swagger.v3.core.util; -import com.fasterxml.jackson.core.JsonParser; -import com.fasterxml.jackson.databind.DeserializationContext; -import com.fasterxml.jackson.databind.JsonDeserializer; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.node.ArrayNode; -import com.fasterxml.jackson.databind.node.ObjectNode; -import com.fasterxml.jackson.databind.node.TextNode; +import tools.jackson.core.JacksonException; +import tools.jackson.core.JsonParser; +import tools.jackson.databind.DeserializationContext; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.node.ArrayNode; +import tools.jackson.databind.node.ObjectNode; import io.swagger.v3.oas.models.media.ArbitrarySchema; import io.swagger.v3.oas.models.media.ArraySchema; import io.swagger.v3.oas.models.media.BooleanSchema; @@ -24,6 +23,8 @@ import io.swagger.v3.oas.models.media.StringSchema; import io.swagger.v3.oas.models.media.UUIDSchema; import org.apache.commons.lang3.StringUtils; +import tools.jackson.databind.ValueDeserializer; +import tools.jackson.databind.node.StringNode; import java.io.IOException; import java.util.Arrays; @@ -31,7 +32,7 @@ import java.util.List; import java.util.Set; -public class ModelDeserializer extends JsonDeserializer { +public class ModelDeserializer extends ValueDeserializer { static Boolean useArbitrarySchema = false; static { @@ -45,8 +46,8 @@ public class ModelDeserializer extends JsonDeserializer { protected boolean openapi31 = false; @Override public Schema deserialize(JsonParser jp, DeserializationContext ctxt) - throws IOException { - JsonNode node = jp.getCodec().readTree(jp); + throws JacksonException { + JsonNode node = jp.objectReadContext().readTree(jp); Schema schema = null; @@ -66,21 +67,21 @@ public Schema deserialize(JsonParser jp, DeserializationContext ctxt) } JsonNode type = node.get("type"); - String format = node.get("format") == null ? "" : node.get("format").textValue(); + String format = node.get("format") == null ? "" : node.get("format").asString(); - if (type != null && "array".equals(((TextNode) type).textValue())) { + if (type != null && "array".equals(((StringNode) type).textValue())) { schema = Json.mapper().convertValue(node, ArraySchema.class); } else if (type != null) { - if (type.textValue().equals("integer")) { + if (type.asString().equals("integer")) { schema = Json.mapper().convertValue(node, IntegerSchema.class); if (StringUtils.isBlank(format)) { schema.setFormat(null); } - } else if (type.textValue().equals("number")) { + } else if (type.asString().equals("number")) { schema = Json.mapper().convertValue(node, NumberSchema.class); - } else if (type.textValue().equals("boolean")) { + } else if (type.asString().equals("boolean")) { schema = Json.mapper().convertValue(node, BooleanSchema.class); - } else if (type.textValue().equals("string")) { + } else if (type.asString().equals("string")) { if ("date".equals(format)) { schema = Json.mapper().convertValue(node, DateSchema.class); } else if ("date-time".equals(format)) { @@ -94,11 +95,11 @@ public Schema deserialize(JsonParser jp, DeserializationContext ctxt) } else { schema = Json.mapper().convertValue(node, StringSchema.class); } - } else if (type.textValue().equals("object")) { + } else if (type.asString().equals("object")) { schema = deserializeArbitraryOrObjectSchema(node, true); } } else if (node.get("$ref") != null) { - schema = new Schema().$ref(node.get("$ref").asText()); + schema = new Schema().$ref(node.get("$ref").asString()); } else { schema = deserializeArbitraryOrObjectSchema(node, false); } @@ -155,12 +156,12 @@ private Schema deserializeJsonSchema(JsonNode node) { ((ObjectNode)node).remove("additionalProperties"); } schema = Json31.mapper().convertValue(node, JsonSchema.class); - if (type instanceof TextNode) { - schema.types(new LinkedHashSet<>(Arrays.asList(type.textValue()))); - } else if (type instanceof ArrayNode){ + if (type instanceof StringNode) { + schema.types(new LinkedHashSet<>(Arrays.asList(type.asString()))); + } else if (type instanceof ArrayNode arrayNode){ Set types = new LinkedHashSet<>(); - ((ArrayNode)type).elements().forEachRemaining( n -> { - types.add(n.textValue()); + arrayNode.values().iterator().forEachRemaining( n -> { + types.add(n.asString()); }); schema.types(types); } diff --git a/modules/swagger-core/src/main/java/io/swagger/v3/core/util/ObjectMapperFactory.java b/modules/swagger-core/src/main/java/io/swagger/v3/core/util/ObjectMapperFactory.java index a02539f54c..c01dae0de7 100644 --- a/modules/swagger-core/src/main/java/io/swagger/v3/core/util/ObjectMapperFactory.java +++ b/modules/swagger-core/src/main/java/io/swagger/v3/core/util/ObjectMapperFactory.java @@ -1,19 +1,13 @@ package io.swagger.v3.core.util; import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.core.JsonFactory; -import com.fasterxml.jackson.databind.BeanDescription; -import com.fasterxml.jackson.databind.DeserializationFeature; -import com.fasterxml.jackson.databind.JsonSerializer; -import com.fasterxml.jackson.databind.Module; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.SerializationConfig; -import com.fasterxml.jackson.databind.SerializationFeature; -import com.fasterxml.jackson.databind.module.SimpleModule; -import com.fasterxml.jackson.databind.ser.BeanSerializerModifier; -import com.fasterxml.jackson.dataformat.yaml.YAMLFactory; -import com.fasterxml.jackson.dataformat.yaml.YAMLGenerator; -import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; +import tools.jackson.core.StreamWriteFeature; +import tools.jackson.core.json.JsonFactory; +import tools.jackson.databind.*; +import tools.jackson.databind.cfg.MapperBuilder; +import tools.jackson.databind.introspect.DefaultAccessorNamingStrategy; +import tools.jackson.databind.json.JsonMapper; +import tools.jackson.databind.module.SimpleModule; import io.swagger.v3.core.jackson.ExampleSerializer; import io.swagger.v3.core.jackson.Schema31Serializer; import io.swagger.v3.core.jackson.MediaTypeSerializer; @@ -67,9 +61,16 @@ import io.swagger.v3.oas.models.servers.ServerVariable; import io.swagger.v3.oas.models.servers.ServerVariables; import io.swagger.v3.oas.models.tags.Tag; +import tools.jackson.core.TokenStreamFactory; +import tools.jackson.databind.ser.ValueSerializerModifier; +import tools.jackson.dataformat.yaml.YAMLFactory; +import tools.jackson.dataformat.yaml.YAMLFactoryBuilder; +import tools.jackson.dataformat.yaml.YAMLMapper; +import tools.jackson.dataformat.yaml.YAMLWriteFeature; import java.util.LinkedHashMap; import java.util.Map; +import java.util.function.Consumer; public class ObjectMapperFactory { @@ -81,6 +82,10 @@ public static ObjectMapper createJson() { return create(null, false); } + public static ObjectMapper createJson(Consumer>> mapperBuilderCustomizer) { + return create(null, false, mapperBuilderCustomizer); + } + public static ObjectMapper createYaml(YAMLFactory yamlFactory) { return create(yamlFactory, false); } @@ -89,17 +94,26 @@ public static ObjectMapper createYaml() { return createYaml(false); } + public static ObjectMapper createYaml(Consumer>> mapperBuilderCustomizer) { + return createYaml(false, mapperBuilderCustomizer); + } + public static ObjectMapper createYaml(boolean openapi31) { - YAMLFactory factory = new YAMLFactory(); - factory.disable(YAMLGenerator.Feature.WRITE_DOC_START_MARKER); - factory.enable(YAMLGenerator.Feature.MINIMIZE_QUOTES); - factory.enable(YAMLGenerator.Feature.SPLIT_LINES); - factory.enable(YAMLGenerator.Feature.ALWAYS_QUOTE_NUMBERS_AS_STRINGS); + return createYaml(openapi31, mapperBuilder -> {}); + } + + public static ObjectMapper createYaml(boolean openapi31, Consumer>> mapperBuilderCustomizer) { + YAMLFactory factory = YAMLFactory.builder() + .disable(YAMLWriteFeature.WRITE_DOC_START_MARKER) + .enable(YAMLWriteFeature.MINIMIZE_QUOTES) + .enable(YAMLWriteFeature.SPLIT_LINES) + .enable(YAMLWriteFeature.ALWAYS_QUOTE_NUMBERS_AS_STRINGS) + .build(); - return create(factory, openapi31); + return create(factory, openapi31, mapperBuilderCustomizer); } - public static ObjectMapper createJson31(JsonFactory jsonFactory) { + public static ObjectMapper createJson31(TokenStreamFactory jsonFactory) { return create(jsonFactory, true); } @@ -107,6 +121,10 @@ public static ObjectMapper createJson31() { return create(null, true); } + public static ObjectMapper createJson31(Consumer>> mapperBuilderCustomizer) { + return create(null, true, mapperBuilderCustomizer); + } + public static ObjectMapper createYaml31(YAMLFactory yamlFactory) { return create(yamlFactory, true); } @@ -115,25 +133,36 @@ public static ObjectMapper createYaml31() { return createYaml(true); } - public static ObjectMapper create(JsonFactory jsonFactory, boolean openapi31) { - ObjectMapper mapper = jsonFactory == null ? new ObjectMapper() : new ObjectMapper(jsonFactory); + public static ObjectMapper create(TokenStreamFactory jsonFactory, boolean openapi31) { + return create(jsonFactory, openapi31, mapperBuilder -> {}); + } + + public static ObjectMapper create(TokenStreamFactory jsonFactory, boolean openapi31, Consumer>> mapperBuilderCustomizer) { + MapperBuilder> mapperBuilder; + if (jsonFactory instanceof JsonFactory factory) { + mapperBuilder = JsonMapper.builder(factory); + } else if (jsonFactory instanceof YAMLFactory factory) { + mapperBuilder = YAMLMapper.builder(factory); + } else { + mapperBuilder = new ObjectMapper().rebuild(); + } if (!openapi31) { // handle ref schema serialization skipping all other props - mapper.registerModule(new SimpleModule() { + mapperBuilder.addModule(new SimpleModule() { @Override public void setupModule(SetupContext context) { super.setupModule(context); - context.addBeanSerializerModifier(new BeanSerializerModifier() { + context.addSerializerModifier(new ValueSerializerModifier() { @Override - public JsonSerializer modifySerializer( - SerializationConfig config, BeanDescription desc, JsonSerializer serializer) { + public ValueSerializer modifySerializer( + SerializationConfig config, BeanDescription.Supplier desc, ValueSerializer serializer) { if (Schema.class.isAssignableFrom(desc.getBeanClass())) { - return new SchemaSerializer((JsonSerializer) serializer); + return new SchemaSerializer((ValueSerializer) serializer); } else if (MediaType.class.isAssignableFrom(desc.getBeanClass())) { - return new MediaTypeSerializer((JsonSerializer) serializer); + return new MediaTypeSerializer((ValueSerializer) serializer); } else if (Example.class.isAssignableFrom(desc.getBeanClass())) { - return new ExampleSerializer((JsonSerializer) serializer); + return new ExampleSerializer((ValueSerializer) serializer); } return serializer; } @@ -141,20 +170,20 @@ public JsonSerializer modifySerializer( } }); } else { - mapper.registerModule(new SimpleModule() { + mapperBuilder.addModule(new SimpleModule() { @Override public void setupModule(SetupContext context) { super.setupModule(context); - context.addBeanSerializerModifier(new BeanSerializerModifier() { + context.addSerializerModifier(new ValueSerializerModifier() { @Override - public JsonSerializer modifySerializer( - SerializationConfig config, BeanDescription desc, JsonSerializer serializer) { + public ValueSerializer modifySerializer( + SerializationConfig config, BeanDescription.Supplier desc, ValueSerializer serializer) { if (Schema.class.isAssignableFrom(desc.getBeanClass())) { - return new Schema31Serializer((JsonSerializer) serializer); + return new Schema31Serializer((ValueSerializer) serializer); } else if (MediaType.class.isAssignableFrom(desc.getBeanClass())) { - return new MediaTypeSerializer((JsonSerializer) serializer); + return new MediaTypeSerializer((ValueSerializer) serializer); } else if (Example.class.isAssignableFrom(desc.getBeanClass())) { - return new ExampleSerializer((JsonSerializer) serializer); + return new ExampleSerializer((ValueSerializer) serializer); } return serializer; } @@ -164,13 +193,12 @@ public JsonSerializer modifySerializer( } if (!openapi31) { - Module deserializerModule = new DeserializationModule(); - mapper.registerModule(deserializerModule); + JacksonModule deserializerModule = new DeserializationModule(); + mapperBuilder.addModule(deserializerModule); } else { - Module deserializerModule = new DeserializationModule31(); - mapper.registerModule(deserializerModule); + JacksonModule deserializerModule = new DeserializationModule31(); + mapperBuilder.addModule(deserializerModule); } - mapper.registerModule(new JavaTimeModule()); Map, Class> sourceMixins = new LinkedHashMap<>(); @@ -218,26 +246,27 @@ public JsonSerializer modifySerializer( sourceMixins.put(DateSchema.class, DateSchemaMixin.class); sourceMixins.put(Discriminator.class, Discriminator31Mixin.class); } - mapper.setMixIns(sourceMixins); - mapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false); - mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false); - mapper.configure(SerializationFeature.WRITE_ENUMS_USING_TO_STRING, true); - mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); - mapper.configure(SerializationFeature.WRITE_NULL_MAP_VALUES, false); - mapper.configure(SerializationFeature.WRITE_BIGDECIMAL_AS_PLAIN, true); - mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); - - return mapper; + mapperBuilder.addMixIns(sourceMixins); + mapperBuilder.configure(StreamWriteFeature.WRITE_BIGDECIMAL_AS_PLAIN, true); + mapperBuilder.configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY, false); + mapperBuilder.changeDefaultPropertyInclusion(incl -> incl + .withContentInclusion(JsonInclude.Include.NON_NULL) + .withValueInclusion(JsonInclude.Include.NON_NULL)); + mapperBuilder.accessorNaming(new DefaultAccessorNamingStrategy.Provider() + .withFirstCharAcceptance(true, true)); + + mapperBuilderCustomizer.accept(mapperBuilder); + + return mapperBuilder.build(); } public static ObjectMapper createJsonConverter() { - ObjectMapper mapper = new ObjectMapper(); + JsonMapper.Builder builder = JsonMapper.builder(); - Module deserializerModule = new DeserializationModule(); - mapper.registerModule(deserializerModule); - mapper.registerModule(new JavaTimeModule()); + JacksonModule deserializerModule = new DeserializationModule(); + builder.addModule(deserializerModule); Map, Class> sourceMixins = new LinkedHashMap<>(); @@ -273,33 +302,21 @@ public static ObjectMapper createJsonConverter() { sourceMixins.put(XML.class, ExtensionsMixin.class); sourceMixins.put(Schema.class, SchemaConverterMixin.class); - mapper.setMixIns(sourceMixins); - mapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false); - mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false); - mapper.configure(SerializationFeature.WRITE_ENUMS_USING_TO_STRING, true); - mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); - mapper.configure(SerializationFeature.WRITE_NULL_MAP_VALUES, false); - mapper.configure(SerializationFeature.WRITE_BIGDECIMAL_AS_PLAIN, true); - mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); - - return mapper; + builder.addMixIns(sourceMixins); + builder.configure(StreamWriteFeature.WRITE_BIGDECIMAL_AS_PLAIN, true); + builder.changeDefaultPropertyInclusion(incl -> incl + .withContentInclusion(JsonInclude.Include.NON_NULL) + .withValueInclusion(JsonInclude.Include.NON_NULL)); + + return builder.build(); } public static ObjectMapper buildStrictGenericObjectMapper() { - ObjectMapper mapper = new ObjectMapper(); - mapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false); - mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false); - mapper.configure(SerializationFeature.WRITE_ENUMS_USING_TO_STRING, true); - mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); - mapper.configure(SerializationFeature.WRITE_NULL_MAP_VALUES, false); - try { - mapper.configure(DeserializationFeature.valueOf("FAIL_ON_TRAILING_TOKENS"), true); - } catch (Throwable e) { - // add only if supported by Jackson version 2.9+ - } - mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); - return mapper; + JsonMapper.Builder builder = JsonMapper.builder(); + builder.changeDefaultPropertyInclusion(incl -> incl + .withContentInclusion(JsonInclude.Include.NON_NULL) + .withValueInclusion(JsonInclude.Include.NON_NULL)); + return builder.build(); } - } diff --git a/modules/swagger-core/src/main/java/io/swagger/v3/core/util/OpenAPI31Deserializer.java b/modules/swagger-core/src/main/java/io/swagger/v3/core/util/OpenAPI31Deserializer.java index 16e64b2ac5..905a49d09d 100644 --- a/modules/swagger-core/src/main/java/io/swagger/v3/core/util/OpenAPI31Deserializer.java +++ b/modules/swagger-core/src/main/java/io/swagger/v3/core/util/OpenAPI31Deserializer.java @@ -1,36 +1,31 @@ package io.swagger.v3.core.util; -import com.fasterxml.jackson.core.JsonParser; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.DeserializationContext; -import com.fasterxml.jackson.databind.JsonDeserializer; -import com.fasterxml.jackson.databind.JsonMappingException; -import com.fasterxml.jackson.databind.deser.ResolvableDeserializer; -import com.fasterxml.jackson.databind.deser.std.StdDeserializer; +import tools.jackson.core.JsonParser; +import tools.jackson.databind.DeserializationContext; +import tools.jackson.databind.deser.std.DelegatingDeserializer; import io.swagger.v3.oas.models.OpenAPI; import io.swagger.v3.oas.models.SpecVersion; +import tools.jackson.core.JacksonException; +import tools.jackson.databind.ValueDeserializer; -import java.io.IOException; +public class OpenAPI31Deserializer extends DelegatingDeserializer { -public class OpenAPI31Deserializer extends StdDeserializer implements ResolvableDeserializer { - - private final JsonDeserializer defaultDeserializer; - - public OpenAPI31Deserializer(JsonDeserializer defaultDeserializer) + public OpenAPI31Deserializer(ValueDeserializer defaultDeserializer) { - super(OpenAPI.class); - this.defaultDeserializer = defaultDeserializer; + super(defaultDeserializer); + } + + @Override + protected ValueDeserializer newDelegatingInstance(ValueDeserializer newDelegatee) { + return new OpenAPI31Deserializer(newDelegatee); } @Override public OpenAPI deserialize(JsonParser jp, DeserializationContext ctxt) - throws IOException, JsonProcessingException { - OpenAPI openAPI = (OpenAPI) defaultDeserializer.deserialize(jp, ctxt); + throws JacksonException { + OpenAPI openAPI = (OpenAPI) super.deserialize(jp, ctxt); openAPI.setSpecVersion(SpecVersion.V31); return openAPI; } - @Override public void resolve(DeserializationContext ctxt) throws JsonMappingException { - ((ResolvableDeserializer) defaultDeserializer).resolve(ctxt); - } } diff --git a/modules/swagger-core/src/main/java/io/swagger/v3/core/util/OpenAPISchema2JsonSchema.java b/modules/swagger-core/src/main/java/io/swagger/v3/core/util/OpenAPISchema2JsonSchema.java index d1b8662acb..9d83dc7b5d 100644 --- a/modules/swagger-core/src/main/java/io/swagger/v3/core/util/OpenAPISchema2JsonSchema.java +++ b/modules/swagger-core/src/main/java/io/swagger/v3/core/util/OpenAPISchema2JsonSchema.java @@ -1,6 +1,6 @@ package io.swagger.v3.core.util; -import com.fasterxml.jackson.databind.ObjectMapper; +import tools.jackson.databind.ObjectMapper; import io.swagger.v3.oas.models.SpecVersion; import io.swagger.v3.oas.models.media.Schema; diff --git a/modules/swagger-core/src/main/java/io/swagger/v3/core/util/ParameterDeserializer.java b/modules/swagger-core/src/main/java/io/swagger/v3/core/util/ParameterDeserializer.java index 14918e8858..8d04273c87 100644 --- a/modules/swagger-core/src/main/java/io/swagger/v3/core/util/ParameterDeserializer.java +++ b/modules/swagger-core/src/main/java/io/swagger/v3/core/util/ParameterDeserializer.java @@ -1,42 +1,44 @@ package io.swagger.v3.core.util; -import com.fasterxml.jackson.core.JsonParser; -import com.fasterxml.jackson.databind.DeserializationContext; -import com.fasterxml.jackson.databind.DeserializationFeature; -import com.fasterxml.jackson.databind.JsonDeserializer; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.ObjectReader; +import tools.jackson.core.JacksonException; +import tools.jackson.core.JsonParser; +import tools.jackson.databind.DeserializationContext; +import tools.jackson.databind.DeserializationFeature; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.ObjectMapper; +import tools.jackson.databind.ObjectReader; import io.swagger.v3.oas.models.parameters.CookieParameter; import io.swagger.v3.oas.models.parameters.HeaderParameter; import io.swagger.v3.oas.models.parameters.Parameter; import io.swagger.v3.oas.models.parameters.PathParameter; import io.swagger.v3.oas.models.parameters.QueryParameter; +import tools.jackson.databind.ValueDeserializer; +import tools.jackson.databind.cfg.EnumFeature; import java.io.IOException; -public class ParameterDeserializer extends JsonDeserializer { +public class ParameterDeserializer extends ValueDeserializer { protected boolean openapi31; @Override public Parameter deserialize(JsonParser jp, DeserializationContext ctxt) - throws IOException { + throws JacksonException { Parameter result = null; - JsonNode node = jp.getCodec().readTree(jp); + JsonNode node = jp.objectReadContext().readTree(jp); JsonNode sub = node.get("$ref"); JsonNode inNode = node.get("in"); JsonNode desc = node.get("description"); if (sub != null) { - result = new Parameter().$ref(sub.asText()); + result = new Parameter().$ref(sub.asString()); if (desc != null && openapi31) { - result.description(desc.asText()); + result.description(desc.asString()); } } else if (inNode != null) { - String in = inNode.asText(); + String in = inNode.asString(); ObjectReader reader = null; ObjectMapper mapper = null; @@ -57,7 +59,7 @@ public Parameter deserialize(JsonParser jp, DeserializationContext ctxt) reader = mapper.readerFor(CookieParameter.class); } if (reader != null) { - result = reader.with(DeserializationFeature.READ_ENUMS_USING_TO_STRING).readValue(node); + result = reader.with(EnumFeature.READ_ENUMS_USING_TO_STRING).readValue(node); } } diff --git a/modules/swagger-core/src/main/java/io/swagger/v3/core/util/ParameterProcessor.java b/modules/swagger-core/src/main/java/io/swagger/v3/core/util/ParameterProcessor.java index b49e86736c..5568fc8161 100644 --- a/modules/swagger-core/src/main/java/io/swagger/v3/core/util/ParameterProcessor.java +++ b/modules/swagger-core/src/main/java/io/swagger/v3/core/util/ParameterProcessor.java @@ -16,6 +16,7 @@ import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import tools.jackson.core.JacksonException; import java.io.IOException; import java.lang.annotation.Annotation; @@ -194,7 +195,7 @@ public static Parameter applyAnnotations( if (StringUtils.isNotBlank(p.example())) { try { parameter.setExample(Json.mapper().readTree(p.example())); - } catch (IOException e) { + } catch (JacksonException e) { parameter.setExample(p.example()); } } diff --git a/modules/swagger-core/src/main/java/io/swagger/v3/core/util/PathsDeserializer.java b/modules/swagger-core/src/main/java/io/swagger/v3/core/util/PathsDeserializer.java index f1738165e7..4a35788b85 100644 --- a/modules/swagger-core/src/main/java/io/swagger/v3/core/util/PathsDeserializer.java +++ b/modules/swagger-core/src/main/java/io/swagger/v3/core/util/PathsDeserializer.java @@ -1,26 +1,27 @@ package io.swagger.v3.core.util; -import com.fasterxml.jackson.core.JsonParser; -import com.fasterxml.jackson.databind.DeserializationContext; -import com.fasterxml.jackson.databind.JsonDeserializer; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.node.ObjectNode; +import tools.jackson.core.JacksonException; +import tools.jackson.core.JsonParser; +import tools.jackson.databind.DeserializationContext; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.ObjectMapper; +import tools.jackson.databind.node.ObjectNode; import io.swagger.v3.oas.models.PathItem; import io.swagger.v3.oas.models.Paths; +import tools.jackson.databind.ValueDeserializer; import java.io.IOException; import java.util.Iterator; import java.util.LinkedHashMap; import java.util.Map; -public class PathsDeserializer extends JsonDeserializer { +public class PathsDeserializer extends ValueDeserializer { protected boolean openapi31; @Override public Paths deserialize(JsonParser jp, DeserializationContext ctxt) - throws IOException { + throws JacksonException { final ObjectMapper mapper; if (openapi31) { @@ -30,12 +31,12 @@ public Paths deserialize(JsonParser jp, DeserializationContext ctxt) } Paths result = new Paths(); - JsonNode node = jp.getCodec().readTree(jp); + JsonNode node = jp.objectReadContext().readTree(jp); ObjectNode objectNode = (ObjectNode)node; Map extensions = new LinkedHashMap<>(); - for (Iterator it = objectNode.fieldNames(); it.hasNext(); ) { - String childName = it.next(); - JsonNode child = objectNode.get(childName); + for (Map.Entry entry : objectNode.properties()) { + String childName = entry.getKey(); + JsonNode child = entry.getValue(); // if name start with `x-` consider it an extesion if (childName.startsWith("x-")) { extensions.put(childName, mapper.convertValue(child, Object.class)); diff --git a/modules/swagger-core/src/main/java/io/swagger/v3/core/util/PrimitiveType.java b/modules/swagger-core/src/main/java/io/swagger/v3/core/util/PrimitiveType.java index 4ec3b94ecc..cd22329771 100644 --- a/modules/swagger-core/src/main/java/io/swagger/v3/core/util/PrimitiveType.java +++ b/modules/swagger-core/src/main/java/io/swagger/v3/core/util/PrimitiveType.java @@ -1,6 +1,6 @@ package io.swagger.v3.core.util; -import com.fasterxml.jackson.databind.type.TypeFactory; +import tools.jackson.databind.type.TypeFactory; import io.swagger.v3.oas.models.media.BinarySchema; import io.swagger.v3.oas.models.media.BooleanSchema; import io.swagger.v3.oas.models.media.ByteArraySchema; @@ -452,7 +452,7 @@ public static Set nonSystemTypePackages() { } public static PrimitiveType fromTypeAndFormat(Type type, String format) { - final Class raw = TypeFactory.defaultInstance().constructType(type).getRawClass(); + final Class raw = TypeFactory.createDefaultInstance().constructType(type).getRawClass(); final Collection keys = MULTI_KEY_CLASSES.get(raw); if (keys == null || keys.isEmpty() || StringUtils.isBlank(format)) { return fromType(type); @@ -466,7 +466,7 @@ public static PrimitiveType fromTypeAndFormat(Type type, String format) { } public static PrimitiveType fromType(Type type) { - final Class raw = TypeFactory.defaultInstance().constructType(type).getRawClass(); + final Class raw = TypeFactory.createDefaultInstance().constructType(type).getRawClass(); final PrimitiveType key = KEY_CLASSES.get(raw); if (key != null) { if (!customExcludedClasses.contains(raw.getName())) { diff --git a/modules/swagger-core/src/main/java/io/swagger/v3/core/util/ReferenceTypeUtils.java b/modules/swagger-core/src/main/java/io/swagger/v3/core/util/ReferenceTypeUtils.java index feeb61356a..055ad5827e 100644 --- a/modules/swagger-core/src/main/java/io/swagger/v3/core/util/ReferenceTypeUtils.java +++ b/modules/swagger-core/src/main/java/io/swagger/v3/core/util/ReferenceTypeUtils.java @@ -1,6 +1,6 @@ package io.swagger.v3.core.util; -import com.fasterxml.jackson.databind.JavaType; +import tools.jackson.databind.JavaType; import io.swagger.v3.core.converter.AnnotatedType; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/modules/swagger-core/src/main/java/io/swagger/v3/core/util/ReflectionUtils.java b/modules/swagger-core/src/main/java/io/swagger/v3/core/util/ReflectionUtils.java index f8b0c08a7d..936ce40404 100644 --- a/modules/swagger-core/src/main/java/io/swagger/v3/core/util/ReflectionUtils.java +++ b/modules/swagger-core/src/main/java/io/swagger/v3/core/util/ReflectionUtils.java @@ -1,7 +1,7 @@ package io.swagger.v3.core.util; -import com.fasterxml.jackson.databind.JavaType; -import com.fasterxml.jackson.databind.type.TypeFactory; +import tools.jackson.databind.JavaType; +import tools.jackson.databind.type.TypeFactory; import org.apache.commons.lang3.ArrayUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -435,7 +435,7 @@ public static Annotation[][] getParameterAnnotations(Method method) { * @return true if the type is void */ public static boolean isVoid(Type type) { - final Class cls = TypeFactory.defaultInstance().constructType(type).getRawClass(); + final Class cls = TypeFactory.createDefaultInstance().constructType(type).getRawClass(); return Void.class.isAssignableFrom(cls) || Void.TYPE.isAssignableFrom(cls); } diff --git a/modules/swagger-core/src/main/java/io/swagger/v3/core/util/SecuritySchemeDeserializer.java b/modules/swagger-core/src/main/java/io/swagger/v3/core/util/SecuritySchemeDeserializer.java index 25756a9daf..172872b242 100644 --- a/modules/swagger-core/src/main/java/io/swagger/v3/core/util/SecuritySchemeDeserializer.java +++ b/modules/swagger-core/src/main/java/io/swagger/v3/core/util/SecuritySchemeDeserializer.java @@ -1,26 +1,25 @@ package io.swagger.v3.core.util; -import com.fasterxml.jackson.core.JsonParseException; -import com.fasterxml.jackson.core.JsonParser; -import com.fasterxml.jackson.databind.DeserializationContext; -import com.fasterxml.jackson.databind.JsonDeserializer; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; +import tools.jackson.core.JacksonException; +import tools.jackson.core.JsonParser; +import tools.jackson.core.exc.StreamReadException; +import tools.jackson.databind.DeserializationContext; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.ObjectMapper; import io.swagger.v3.oas.models.security.OAuthFlows; import io.swagger.v3.oas.models.security.SecurityScheme; +import tools.jackson.databind.ValueDeserializer; -import java.io.IOException; import java.util.Arrays; import java.util.Iterator; -import java.util.List; -public class SecuritySchemeDeserializer extends JsonDeserializer { +public class SecuritySchemeDeserializer extends ValueDeserializer { protected boolean openapi31; @Override public SecurityScheme deserialize(JsonParser jp, DeserializationContext ctxt) - throws IOException { + throws JacksonException { ObjectMapper mapper = null; if (openapi31) { mapper = Json31.mapper(); @@ -29,15 +28,15 @@ public SecurityScheme deserialize(JsonParser jp, DeserializationContext ctxt) } SecurityScheme result = null; - JsonNode node = jp.getCodec().readTree(jp); + JsonNode node = jp.objectReadContext().readTree(jp); JsonNode inNode = node.get("type"); if (inNode != null) { - String type = inNode.asText(); + String type = inNode.asString(); if (Arrays.stream(SecurityScheme.Type.values()).noneMatch(t -> t.toString().equals(type))) { // wrong type, throw exception - throw new JsonParseException(jp, String.format("SecurityScheme type %s not allowed", type)); + throw new StreamReadException(jp, "SecurityScheme type %s not allowed".formatted(type)); } result = new SecurityScheme() .description(getFieldText("description", node)); @@ -64,7 +63,7 @@ public SecurityScheme deserialize(JsonParser jp, DeserializationContext ctxt) result .type(SecurityScheme.Type.MUTUALTLS); } - final Iterator fieldNames = node.fieldNames(); + final Iterator fieldNames = node.propertyNames().iterator(); while(fieldNames.hasNext()) { final String fieldName = fieldNames.next(); if(fieldName.startsWith("x-")) { @@ -85,7 +84,7 @@ private SecurityScheme.In getIn(String value) { private String getFieldText(String fieldName, JsonNode node) { JsonNode inNode = node.get(fieldName); if (inNode != null) { - return inNode.asText(); + return inNode.asString(); } return null; } diff --git a/modules/swagger-core/src/main/java/io/swagger/v3/core/util/Yaml.java b/modules/swagger-core/src/main/java/io/swagger/v3/core/util/Yaml.java index 8a7504e1b8..bfa3112395 100644 --- a/modules/swagger-core/src/main/java/io/swagger/v3/core/util/Yaml.java +++ b/modules/swagger-core/src/main/java/io/swagger/v3/core/util/Yaml.java @@ -1,10 +1,14 @@ package io.swagger.v3.core.util; -import com.fasterxml.jackson.core.util.DefaultPrettyPrinter; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.ObjectWriter; +import tools.jackson.core.util.DefaultPrettyPrinter; +import tools.jackson.databind.ObjectMapper; +import tools.jackson.databind.ObjectWriter; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import tools.jackson.databind.cfg.MapperBuilder; +import tools.jackson.dataformat.yaml.YAMLFactoryBuilder; + +import java.util.function.Consumer; public class Yaml { @@ -18,8 +22,12 @@ public static ObjectMapper mapper() { return ObjectMapperHolder.MAPPER; } + public static ObjectMapper mapper(Consumer>> mapperBuilderCustomizer) { + return ObjectMapperFactory.createYaml(mapperBuilderCustomizer); + } + public static ObjectWriter pretty() { - return mapper().writer(new DefaultPrettyPrinter()); + return mapper().writerWithDefaultPrettyPrinter(); } public static String pretty(Object o) { diff --git a/modules/swagger-core/src/main/java/io/swagger/v3/core/util/Yaml31.java b/modules/swagger-core/src/main/java/io/swagger/v3/core/util/Yaml31.java index 4189d4f8d9..fd1906f599 100644 --- a/modules/swagger-core/src/main/java/io/swagger/v3/core/util/Yaml31.java +++ b/modules/swagger-core/src/main/java/io/swagger/v3/core/util/Yaml31.java @@ -1,12 +1,12 @@ package io.swagger.v3.core.util; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.core.util.DefaultPrettyPrinter; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.ObjectWriter; +import tools.jackson.core.util.DefaultPrettyPrinter; +import tools.jackson.databind.ObjectMapper; +import tools.jackson.databind.ObjectWriter; import io.swagger.v3.oas.models.media.Schema; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import tools.jackson.core.JacksonException; import java.util.Map; @@ -24,7 +24,7 @@ public static ObjectMapper mapper() { } public static ObjectWriter pretty() { - return mapper().writer(new DefaultPrettyPrinter()); + return mapper().writerWithDefaultPrettyPrinter(); } public static String pretty(Object o) { @@ -48,7 +48,7 @@ public static void prettyPrint(Object o) { public static Map jsonSchemaAsMap(String jsonSchema) { try { return mapper().readValue(jsonSchema, Map.class); - } catch (JsonProcessingException e) { + } catch (JacksonException e) { LOGGER.error("Exception converting jsonSchema to Map", e); return null; } @@ -57,7 +57,7 @@ public static Map jsonSchemaAsMap(String jsonSchema) { public static Map jsonSchemaAsMap(Schema schema) { try { return mapper().readValue(mapper().writeValueAsString(schema), Map.class); - } catch (JsonProcessingException e) { + } catch (JacksonException e) { LOGGER.error("Exception converting jsonSchema to Map", e); return null; } diff --git a/modules/swagger-core/src/test/java/io/swagger/v3/core/converting/ArrayOfSubclassTest.java b/modules/swagger-core/src/test/java/io/swagger/v3/core/converting/ArrayOfSubclassTest.java index e378f4ef5c..bced549ed3 100644 --- a/modules/swagger-core/src/test/java/io/swagger/v3/core/converting/ArrayOfSubclassTest.java +++ b/modules/swagger-core/src/test/java/io/swagger/v3/core/converting/ArrayOfSubclassTest.java @@ -10,9 +10,12 @@ import org.testng.annotations.Test; import java.nio.file.Files; -import java.nio.file.Paths; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.JsonNode; +import java.nio.file.Path; + +import tools.jackson.core.StreamReadFeature; +import tools.jackson.databind.ObjectMapper; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.json.JsonMapper; public class ArrayOfSubclassTest { @@ -21,9 +24,11 @@ public class ArrayOfSubclassTest { public void extractSubclassArray_oas31() throws Exception { ResolvedSchema schema = ModelConverters.getInstance(true).readAllAsResolvedSchema(ModelWithArrayOfSubclasses.Holder.class); assertNotNull(schema); - String expectedJson = new String(Files.readAllBytes(Paths.get("src/test/java/io/swagger/v3/core/converting/ArrayOfSubclassTest_expected31.json"))); + String expectedJson = new String(Files.readAllBytes(Path.of("src/test/java/io/swagger/v3/core/converting/ArrayOfSubclassTest_expected31.json"))); String actualJson = Json31.pretty(schema); - ObjectMapper mapper = new ObjectMapper(); + ObjectMapper mapper = JsonMapper.builder() + .enable(StreamReadFeature.INCLUDE_SOURCE_IN_LOCATION) + .build(); JsonNode expectedNode = mapper.readTree(expectedJson); JsonNode actualNode = mapper.readTree(actualJson); assertEquals(actualNode, expectedNode); @@ -33,9 +38,11 @@ public void extractSubclassArray_oas31() throws Exception { public void extractSubclassArray_oas30() throws Exception { ResolvedSchema schema = ModelConverters.getInstance(false).readAllAsResolvedSchema(ModelWithArrayOfSubclasses.Holder.class); assertNotNull(schema); - String expectedJson = new String(Files.readAllBytes(Paths.get("src/test/java/io/swagger/v3/core/converting/ArrayOfSubclassTest_expected30.json"))); + String expectedJson = new String(Files.readAllBytes(Path.of("src/test/java/io/swagger/v3/core/converting/ArrayOfSubclassTest_expected30.json"))); String actualJson = Json31.pretty(schema); - ObjectMapper mapper = new ObjectMapper(); + ObjectMapper mapper = JsonMapper.builder() + .enable(StreamReadFeature.INCLUDE_SOURCE_IN_LOCATION) + .build(); JsonNode expectedNode = mapper.readTree(expectedJson); JsonNode actualNode = mapper.readTree(actualJson); assertEquals(actualNode, expectedNode); diff --git a/modules/swagger-core/src/test/java/io/swagger/v3/core/converting/EnumPropertyTest.java b/modules/swagger-core/src/test/java/io/swagger/v3/core/converting/EnumPropertyTest.java index ea22349731..55222e4f12 100644 --- a/modules/swagger-core/src/test/java/io/swagger/v3/core/converting/EnumPropertyTest.java +++ b/modules/swagger-core/src/test/java/io/swagger/v3/core/converting/EnumPropertyTest.java @@ -1,6 +1,6 @@ package io.swagger.v3.core.converting; -import com.fasterxml.jackson.databind.ObjectMapper; +import tools.jackson.databind.ObjectMapper; import io.swagger.v3.core.converter.AnnotatedType; import io.swagger.v3.core.converter.ModelConverterContextImpl; import io.swagger.v3.core.converter.ModelConverters; diff --git a/modules/swagger-core/src/test/java/io/swagger/v3/core/converting/ModelConverterTest.java b/modules/swagger-core/src/test/java/io/swagger/v3/core/converting/ModelConverterTest.java index 13a0fa1220..1aea148be5 100644 --- a/modules/swagger-core/src/test/java/io/swagger/v3/core/converting/ModelConverterTest.java +++ b/modules/swagger-core/src/test/java/io/swagger/v3/core/converting/ModelConverterTest.java @@ -1,7 +1,7 @@ package io.swagger.v3.core.converting; import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import tools.jackson.databind.annotation.JsonSerialize; import com.google.common.collect.ImmutableSet; import io.swagger.v3.core.converter.ModelConverters; import io.swagger.v3.core.matchers.SerializationMatchers; diff --git a/modules/swagger-core/src/test/java/io/swagger/v3/core/converting/PolymorphicSubtypePropertyBleedTest.java b/modules/swagger-core/src/test/java/io/swagger/v3/core/converting/PolymorphicSubtypePropertyBleedTest.java index 614d5a56d9..f0fd7553c5 100644 --- a/modules/swagger-core/src/test/java/io/swagger/v3/core/converting/PolymorphicSubtypePropertyBleedTest.java +++ b/modules/swagger-core/src/test/java/io/swagger/v3/core/converting/PolymorphicSubtypePropertyBleedTest.java @@ -1,6 +1,6 @@ package io.swagger.v3.core.converting; -import com.fasterxml.jackson.databind.ObjectMapper; +import tools.jackson.databind.ObjectMapper; import io.swagger.v3.core.converter.AnnotatedType; import io.swagger.v3.core.converter.ModelConverterContextImpl; import io.swagger.v3.core.jackson.ModelResolver; diff --git a/modules/swagger-core/src/test/java/io/swagger/v3/core/converting/SwaggerSerializerTest.java b/modules/swagger-core/src/test/java/io/swagger/v3/core/converting/SwaggerSerializerTest.java index 81095f4e6d..921627b6b8 100644 --- a/modules/swagger-core/src/test/java/io/swagger/v3/core/converting/SwaggerSerializerTest.java +++ b/modules/swagger-core/src/test/java/io/swagger/v3/core/converting/SwaggerSerializerTest.java @@ -1,6 +1,6 @@ package io.swagger.v3.core.converting; -import com.fasterxml.jackson.databind.ObjectMapper; +import tools.jackson.databind.ObjectMapper; import io.swagger.v3.core.converter.ModelConverters; import io.swagger.v3.core.matchers.SerializationMatchers; import io.swagger.v3.core.oas.models.Person; diff --git a/modules/swagger-core/src/test/java/io/swagger/v3/core/converting/override/CustomAnnotationConverter.java b/modules/swagger-core/src/test/java/io/swagger/v3/core/converting/override/CustomAnnotationConverter.java index 4599a18647..4a7485c538 100644 --- a/modules/swagger-core/src/test/java/io/swagger/v3/core/converting/override/CustomAnnotationConverter.java +++ b/modules/swagger-core/src/test/java/io/swagger/v3/core/converting/override/CustomAnnotationConverter.java @@ -1,6 +1,6 @@ package io.swagger.v3.core.converting.override; -import com.fasterxml.jackson.databind.ObjectMapper; +import tools.jackson.databind.ObjectMapper; import io.swagger.v3.core.converter.AnnotatedType; import io.swagger.v3.core.converter.ModelConverter; import io.swagger.v3.core.converter.ModelConverterContext; diff --git a/modules/swagger-core/src/test/java/io/swagger/v3/core/converting/override/CustomConverterTest.java b/modules/swagger-core/src/test/java/io/swagger/v3/core/converting/override/CustomConverterTest.java index 5ac77acefc..d63aa8ee2b 100644 --- a/modules/swagger-core/src/test/java/io/swagger/v3/core/converting/override/CustomConverterTest.java +++ b/modules/swagger-core/src/test/java/io/swagger/v3/core/converting/override/CustomConverterTest.java @@ -1,6 +1,6 @@ package io.swagger.v3.core.converting.override; -import com.fasterxml.jackson.databind.JavaType; +import tools.jackson.databind.JavaType; import io.swagger.v3.core.converter.AnnotatedType; import io.swagger.v3.core.converter.ModelConverter; import io.swagger.v3.core.converter.ModelConverterContext; diff --git a/modules/swagger-core/src/test/java/io/swagger/v3/core/converting/override/CustomResolverTest.java b/modules/swagger-core/src/test/java/io/swagger/v3/core/converting/override/CustomResolverTest.java index 0cb8133328..3fceb4cf57 100644 --- a/modules/swagger-core/src/test/java/io/swagger/v3/core/converting/override/CustomResolverTest.java +++ b/modules/swagger-core/src/test/java/io/swagger/v3/core/converting/override/CustomResolverTest.java @@ -1,6 +1,6 @@ package io.swagger.v3.core.converting.override; -import com.fasterxml.jackson.databind.ObjectMapper; +import tools.jackson.databind.ObjectMapper; import io.swagger.v3.core.converter.ModelConverters; import io.swagger.v3.core.jackson.ModelResolver; import io.swagger.v3.core.jackson.TypeNameResolver; diff --git a/modules/swagger-core/src/test/java/io/swagger/v3/core/converting/override/SamplePropertyConverter.java b/modules/swagger-core/src/test/java/io/swagger/v3/core/converting/override/SamplePropertyConverter.java index d309e06dfa..6227ca539e 100644 --- a/modules/swagger-core/src/test/java/io/swagger/v3/core/converting/override/SamplePropertyConverter.java +++ b/modules/swagger-core/src/test/java/io/swagger/v3/core/converting/override/SamplePropertyConverter.java @@ -1,6 +1,6 @@ package io.swagger.v3.core.converting.override; -import com.fasterxml.jackson.databind.JavaType; +import tools.jackson.databind.JavaType; import io.swagger.v3.core.converter.AnnotatedType; import io.swagger.v3.core.converter.ModelConverter; import io.swagger.v3.core.converter.ModelConverterContext; diff --git a/modules/swagger-core/src/test/java/io/swagger/v3/core/converting/override/SamplePropertyExtendedConverter.java b/modules/swagger-core/src/test/java/io/swagger/v3/core/converting/override/SamplePropertyExtendedConverter.java index a4eb76c969..b93779ed16 100644 --- a/modules/swagger-core/src/test/java/io/swagger/v3/core/converting/override/SamplePropertyExtendedConverter.java +++ b/modules/swagger-core/src/test/java/io/swagger/v3/core/converting/override/SamplePropertyExtendedConverter.java @@ -1,7 +1,7 @@ package io.swagger.v3.core.converting.override; -import com.fasterxml.jackson.databind.JavaType; -import com.fasterxml.jackson.databind.ObjectMapper; +import tools.jackson.databind.JavaType; +import tools.jackson.databind.ObjectMapper; import io.swagger.v3.core.converter.AnnotatedType; import io.swagger.v3.core.converter.ModelConverter; import io.swagger.v3.core.converter.ModelConverterContext; diff --git a/modules/swagger-core/src/test/java/io/swagger/v3/core/deserialization/JsonDeserializationTest.java b/modules/swagger-core/src/test/java/io/swagger/v3/core/deserialization/JsonDeserializationTest.java index 3b38d0a97b..550ec64d29 100644 --- a/modules/swagger-core/src/test/java/io/swagger/v3/core/deserialization/JsonDeserializationTest.java +++ b/modules/swagger-core/src/test/java/io/swagger/v3/core/deserialization/JsonDeserializationTest.java @@ -1,6 +1,6 @@ package io.swagger.v3.core.deserialization; -import com.fasterxml.jackson.databind.ObjectMapper; +import tools.jackson.databind.ObjectMapper; import io.swagger.v3.core.matchers.SerializationMatchers; import io.swagger.v3.core.util.Json; import io.swagger.v3.core.util.ResourceUtils; diff --git a/modules/swagger-core/src/test/java/io/swagger/v3/core/deserialization/ParameterDeSerializationTest.java b/modules/swagger-core/src/test/java/io/swagger/v3/core/deserialization/ParameterDeSerializationTest.java index 781692c7a8..095370d75c 100644 --- a/modules/swagger-core/src/test/java/io/swagger/v3/core/deserialization/ParameterDeSerializationTest.java +++ b/modules/swagger-core/src/test/java/io/swagger/v3/core/deserialization/ParameterDeSerializationTest.java @@ -1,6 +1,6 @@ package io.swagger.v3.core.deserialization; -import com.fasterxml.jackson.databind.ObjectMapper; +import tools.jackson.databind.ObjectMapper; import io.swagger.v3.core.matchers.SerializationMatchers; import io.swagger.v3.core.util.Json; import io.swagger.v3.core.util.Yaml; diff --git a/modules/swagger-core/src/test/java/io/swagger/v3/core/matchers/SerializationMatchers.java b/modules/swagger-core/src/test/java/io/swagger/v3/core/matchers/SerializationMatchers.java index 9588434c96..4f5f3b2968 100644 --- a/modules/swagger-core/src/test/java/io/swagger/v3/core/matchers/SerializationMatchers.java +++ b/modules/swagger-core/src/test/java/io/swagger/v3/core/matchers/SerializationMatchers.java @@ -1,9 +1,10 @@ package io.swagger.v3.core.matchers; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.node.NumericNode; -import com.fasterxml.jackson.databind.node.ObjectNode; +import tools.jackson.core.JacksonException; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.ObjectMapper; +import tools.jackson.databind.node.NumericNode; +import tools.jackson.databind.node.ObjectNode; import io.swagger.v3.core.util.Json; import io.swagger.v3.core.util.Json31; import io.swagger.v3.core.util.Yaml; @@ -40,7 +41,7 @@ private static void apply(Object objectToSerialize, String str, ObjectMapper map ObjectNode rhs = null; try { rhs = mapper.readValue(str, ObjectNode.class); - } catch (IOException e) { + } catch (JacksonException e) { LOGGER.error("Failed to read value", e); } if (!lhs.equals(new ObjectNodeComparator(), rhs)) { @@ -53,7 +54,7 @@ private static void apply31(Object objectToSerialize, String str, ObjectMapper m ObjectNode rhs = null; try { rhs = mapper.readValue(str, ObjectNode.class); - } catch (IOException e) { + } catch (JacksonException e) { LOGGER.error("Failed to read value", e); } if (!lhs.equals(new ObjectNodeComparator(), rhs)) { @@ -72,7 +73,7 @@ public int compare(JsonNode o1, JsonNode o2) { double d2 = ((NumericNode) o2).asDouble(); return Double.compare(d1, d2); } - int comp = o1.asText().compareTo(o2.asText()); + int comp = o1.asString().compareTo(o2.asString()); if (comp == 0) { return Integer.compare(o1.hashCode(), o2.hashCode()); } diff --git a/modules/swagger-core/src/test/java/io/swagger/v3/core/oas/models/ClientOptInput.java b/modules/swagger-core/src/test/java/io/swagger/v3/core/oas/models/ClientOptInput.java index 15c3f95c3d..6d4d401264 100644 --- a/modules/swagger-core/src/test/java/io/swagger/v3/core/oas/models/ClientOptInput.java +++ b/modules/swagger-core/src/test/java/io/swagger/v3/core/oas/models/ClientOptInput.java @@ -1,6 +1,6 @@ package io.swagger.v3.core.oas.models; -import com.fasterxml.jackson.databind.JsonNode; +import tools.jackson.databind.JsonNode; import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.models.OpenAPI; diff --git a/modules/swagger-core/src/test/java/io/swagger/v3/core/oas/models/ModelWithTuple2.java b/modules/swagger-core/src/test/java/io/swagger/v3/core/oas/models/ModelWithTuple2.java index e86130819d..d4cdd79e39 100644 --- a/modules/swagger-core/src/test/java/io/swagger/v3/core/oas/models/ModelWithTuple2.java +++ b/modules/swagger-core/src/test/java/io/swagger/v3/core/oas/models/ModelWithTuple2.java @@ -1,8 +1,8 @@ package io.swagger.v3.core.oas.models; -import com.fasterxml.jackson.databind.BeanDescription; -import com.fasterxml.jackson.databind.JavaType; -import com.fasterxml.jackson.databind.ObjectMapper; +import tools.jackson.databind.BeanDescription; +import tools.jackson.databind.JavaType; +import tools.jackson.databind.ObjectMapper; import io.swagger.v3.core.converter.AnnotatedType; import io.swagger.v3.core.converter.ModelConverter; import io.swagger.v3.core.converter.ModelConverterContext; @@ -12,6 +12,7 @@ import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.text.WordUtils; import org.apache.commons.lang3.tuple.Pair; +import tools.jackson.databind.cfg.MapperBuilder; import java.util.Iterator; import java.util.Set; @@ -72,7 +73,7 @@ public Schema resolve(AnnotatedType type, ModelConverterContext context, Schema schema = context.resolve(new AnnotatedType().type(left).schemaProperty(type.isSchemaProperty())); String pName = null; if (left != null) { - BeanDescription valueTypeBeanDesc = _mapper.getSerializationConfig().introspect(left); + BeanDescription valueTypeBeanDesc = _mapper._serializationContext().introspectBeanDescription(left); pName = _typeName(left, valueTypeBeanDesc); } diff --git a/modules/swagger-core/src/test/java/io/swagger/v3/core/resolving/ComposedSchemaTest.java b/modules/swagger-core/src/test/java/io/swagger/v3/core/resolving/ComposedSchemaTest.java index c9bf8d55d8..ba3a437355 100644 --- a/modules/swagger-core/src/test/java/io/swagger/v3/core/resolving/ComposedSchemaTest.java +++ b/modules/swagger-core/src/test/java/io/swagger/v3/core/resolving/ComposedSchemaTest.java @@ -11,8 +11,11 @@ import io.swagger.v3.oas.models.media.ComposedSchema; import io.swagger.v3.oas.models.media.Schema; import org.testng.annotations.Test; +import tools.jackson.databind.ObjectMapper; +import tools.jackson.databind.cfg.MapperBuilder; import java.util.Map; +import java.util.function.Consumer; import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertFalse; @@ -68,8 +71,12 @@ public void readBilateralComposedSchema_ticket2620() { @Test(description = "read composed schem refs #2900") public void readComposedSchema_ticket2900() { - Json.mapper().addMixIn(TestObjectTicket2900.GsonJsonPrimitive.class, TestObjectTicket2900.GsonJsonPrimitiveMixIn.class); - Map schemas = ModelConverters.getInstance().readAll(TestObjectTicket2900.class); + ModelConverters.reset(); + + Consumer>> mapperBuilderCustomizer + = mapperBuilder -> mapperBuilder + .addMixIn(TestObjectTicket2900.GsonJsonPrimitive.class, TestObjectTicket2900.GsonJsonPrimitiveMixIn.class); + Map schemas = ModelConverters.getInstance(mapperBuilderCustomizer).readAll(TestObjectTicket2900.class); Schema model = schemas.get("SomeDTO"); assertNotNull(model); Map properties = model.getProperties(); @@ -89,6 +96,8 @@ public void readComposedSchema_ticket2900() { assertEquals(((ComposedSchema)model).getOneOf().get(0).getType(), "string"); assertEquals(((ComposedSchema)model).getOneOf().get(1).getType(), "number"); assertNull(model.getProperties()); + + ModelConverters.reset(); } @Test(description = "read composed schem refs #2616") diff --git a/modules/swagger-core/src/test/java/io/swagger/v3/core/resolving/InheritedBeanTest.java b/modules/swagger-core/src/test/java/io/swagger/v3/core/resolving/InheritedBeanTest.java index 5a276f5f4f..ff4fe61468 100644 --- a/modules/swagger-core/src/test/java/io/swagger/v3/core/resolving/InheritedBeanTest.java +++ b/modules/swagger-core/src/test/java/io/swagger/v3/core/resolving/InheritedBeanTest.java @@ -2,7 +2,7 @@ import com.fasterxml.jackson.annotation.JsonSubTypes; import com.fasterxml.jackson.annotation.JsonTypeInfo; -import com.fasterxml.jackson.databind.ObjectMapper; +import tools.jackson.databind.ObjectMapper; import io.swagger.v3.core.converter.AnnotatedType; import io.swagger.v3.core.converter.ModelConverterContextImpl; import io.swagger.v3.core.jackson.ModelResolver; diff --git a/modules/swagger-core/src/test/java/io/swagger/v3/core/resolving/JsonViewTest.java b/modules/swagger-core/src/test/java/io/swagger/v3/core/resolving/JsonViewTest.java index f9519f3d81..66a93f55e8 100644 --- a/modules/swagger-core/src/test/java/io/swagger/v3/core/resolving/JsonViewTest.java +++ b/modules/swagger-core/src/test/java/io/swagger/v3/core/resolving/JsonViewTest.java @@ -1,8 +1,7 @@ package io.swagger.v3.core.resolving; import com.fasterxml.jackson.annotation.JsonView; -import com.fasterxml.jackson.databind.MapperFeature; -import com.fasterxml.jackson.databind.ObjectMapper; +import tools.jackson.databind.ObjectMapper; import io.swagger.v3.core.converter.AnnotatedType; import io.swagger.v3.core.converter.ModelConverterContextImpl; import io.swagger.v3.core.jackson.ModelResolver; @@ -53,7 +52,6 @@ public Class[] value() { @JsonView(JsonViewObject.View.Protected.class) public void notIncludePropertiesToWhichJsonviewIsNotAnnotated() throws NoSuchMethodException { ObjectMapper mapper = mapper(); - mapper.disable(MapperFeature.DEFAULT_VIEW_INCLUSION); final ModelResolver modelResolver = new ModelResolver(mapper); final ModelConverterContextImpl context = new ModelConverterContextImpl(modelResolver); diff --git a/modules/swagger-core/src/test/java/io/swagger/v3/core/resolving/SimpleGenerationTest.java b/modules/swagger-core/src/test/java/io/swagger/v3/core/resolving/SimpleGenerationTest.java index 05f0656ab9..b9610764ad 100644 --- a/modules/swagger-core/src/test/java/io/swagger/v3/core/resolving/SimpleGenerationTest.java +++ b/modules/swagger-core/src/test/java/io/swagger/v3/core/resolving/SimpleGenerationTest.java @@ -5,9 +5,9 @@ import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonPropertyOrder; import com.fasterxml.jackson.annotation.JsonValue; -import com.fasterxml.jackson.databind.BeanDescription; -import com.fasterxml.jackson.databind.DeserializationFeature; -import com.fasterxml.jackson.databind.ObjectMapper; +import tools.jackson.databind.BeanDescription; +import tools.jackson.databind.DeserializationFeature; +import tools.jackson.databind.ObjectMapper; import io.swagger.v3.core.converter.AnnotatedType; import io.swagger.v3.core.converter.ModelConverterContextImpl; import io.swagger.v3.core.converter.ModelConverters; diff --git a/modules/swagger-core/src/test/java/io/swagger/v3/core/resolving/SwaggerTestBase.java b/modules/swagger-core/src/test/java/io/swagger/v3/core/resolving/SwaggerTestBase.java index 883ce03423..aaf4797292 100644 --- a/modules/swagger-core/src/test/java/io/swagger/v3/core/resolving/SwaggerTestBase.java +++ b/modules/swagger-core/src/test/java/io/swagger/v3/core/resolving/SwaggerTestBase.java @@ -1,13 +1,16 @@ package io.swagger.v3.core.resolving; import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.core.util.DefaultPrettyPrinter; -import com.fasterxml.jackson.databind.DeserializationFeature; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.SerializationFeature; +import tools.jackson.core.util.DefaultPrettyPrinter; +import tools.jackson.databind.MapperFeature; +import tools.jackson.databind.ObjectMapper; import io.swagger.v3.core.jackson.ModelResolver; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import tools.jackson.databind.cfg.EnumFeature; +import tools.jackson.databind.cfg.MapperBuilder; +import tools.jackson.databind.introspect.DefaultAccessorNamingStrategy; +import tools.jackson.databind.json.JsonMapper; public abstract class SwaggerTestBase { static ObjectMapper mapper; @@ -15,10 +18,15 @@ public abstract class SwaggerTestBase { public static ObjectMapper mapper() { if (mapper == null) { - mapper = new ObjectMapper(); - mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); - mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false); - mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); + mapper = JsonMapper.builder() + .disable(EnumFeature.WRITE_ENUMS_USING_TO_STRING) + .configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY, false) + .changeDefaultPropertyInclusion(incl -> incl + .withContentInclusion(JsonInclude.Include.NON_NULL) + .withValueInclusion(JsonInclude.Include.NON_NULL)) + .accessorNaming(new DefaultAccessorNamingStrategy.Provider() + .withFirstCharAcceptance(true, true)) + .build(); } return mapper; } @@ -29,7 +37,7 @@ protected ModelResolver modelResolver() { protected void prettyPrint(Object o) { try { - LOGGER.debug(mapper().writer(new DefaultPrettyPrinter()).writeValueAsString(o)); + LOGGER.debug(mapper().writerWithDefaultPrettyPrinter().writeValueAsString(o)); } catch (Exception e) { LOGGER.error("Failed to pretty print object", e); } diff --git a/modules/swagger-core/src/test/java/io/swagger/v3/core/resolving/Ticket2189Test.java b/modules/swagger-core/src/test/java/io/swagger/v3/core/resolving/Ticket2189Test.java index 492da9e7f6..4ad32e4e25 100644 --- a/modules/swagger-core/src/test/java/io/swagger/v3/core/resolving/Ticket2189Test.java +++ b/modules/swagger-core/src/test/java/io/swagger/v3/core/resolving/Ticket2189Test.java @@ -2,7 +2,7 @@ import com.fasterxml.jackson.annotation.JsonSubTypes; import com.fasterxml.jackson.annotation.JsonTypeInfo; -import com.fasterxml.jackson.databind.ObjectMapper; +import tools.jackson.databind.ObjectMapper; import org.testng.annotations.BeforeTest; import org.testng.annotations.Test; diff --git a/modules/swagger-core/src/test/java/io/swagger/v3/core/resolving/Ticket3030Test.java b/modules/swagger-core/src/test/java/io/swagger/v3/core/resolving/Ticket3030Test.java index 4d0e14c0cd..5a7c3cb300 100644 --- a/modules/swagger-core/src/test/java/io/swagger/v3/core/resolving/Ticket3030Test.java +++ b/modules/swagger-core/src/test/java/io/swagger/v3/core/resolving/Ticket3030Test.java @@ -1,6 +1,6 @@ package io.swagger.v3.core.resolving; -import com.fasterxml.jackson.databind.ObjectMapper; +import tools.jackson.databind.ObjectMapper; import io.swagger.v3.core.converter.AnnotatedType; import io.swagger.v3.core.converter.ModelConverterContextImpl; import io.swagger.v3.core.jackson.ModelResolver; diff --git a/modules/swagger-core/src/test/java/io/swagger/v3/core/resolving/Ticket3063Test.java b/modules/swagger-core/src/test/java/io/swagger/v3/core/resolving/Ticket3063Test.java index a70a292a39..e92f3484fe 100644 --- a/modules/swagger-core/src/test/java/io/swagger/v3/core/resolving/Ticket3063Test.java +++ b/modules/swagger-core/src/test/java/io/swagger/v3/core/resolving/Ticket3063Test.java @@ -2,7 +2,7 @@ import com.fasterxml.jackson.annotation.JsonSubTypes; import com.fasterxml.jackson.annotation.JsonTypeInfo; -import com.fasterxml.jackson.databind.ObjectMapper; +import tools.jackson.databind.ObjectMapper; import io.swagger.v3.core.converter.AnnotatedType; import io.swagger.v3.core.converter.ModelConverterContextImpl; import io.swagger.v3.core.jackson.ModelResolver; diff --git a/modules/swagger-core/src/test/java/io/swagger/v3/core/resolving/Ticket3197Test.java b/modules/swagger-core/src/test/java/io/swagger/v3/core/resolving/Ticket3197Test.java index b1574a3072..88d583b615 100644 --- a/modules/swagger-core/src/test/java/io/swagger/v3/core/resolving/Ticket3197Test.java +++ b/modules/swagger-core/src/test/java/io/swagger/v3/core/resolving/Ticket3197Test.java @@ -3,7 +3,7 @@ import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonSubTypes; import com.fasterxml.jackson.annotation.JsonTypeInfo; -import com.fasterxml.jackson.databind.ObjectMapper; +import tools.jackson.databind.ObjectMapper; import io.swagger.v3.core.converter.AnnotatedType; import io.swagger.v3.core.converter.ModelConverterContextImpl; import io.swagger.v3.core.jackson.ModelResolver; diff --git a/modules/swagger-core/src/test/java/io/swagger/v3/core/resolving/Ticket3348Test.java b/modules/swagger-core/src/test/java/io/swagger/v3/core/resolving/Ticket3348Test.java index f630cc3ef8..7450522dcf 100644 --- a/modules/swagger-core/src/test/java/io/swagger/v3/core/resolving/Ticket3348Test.java +++ b/modules/swagger-core/src/test/java/io/swagger/v3/core/resolving/Ticket3348Test.java @@ -1,6 +1,6 @@ package io.swagger.v3.core.resolving; -import com.fasterxml.jackson.databind.ObjectMapper; +import tools.jackson.databind.ObjectMapper; import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; diff --git a/modules/swagger-core/src/test/java/io/swagger/v3/core/resolving/Ticket3365Test.java b/modules/swagger-core/src/test/java/io/swagger/v3/core/resolving/Ticket3365Test.java index e4830f0de8..45deaeef94 100644 --- a/modules/swagger-core/src/test/java/io/swagger/v3/core/resolving/Ticket3365Test.java +++ b/modules/swagger-core/src/test/java/io/swagger/v3/core/resolving/Ticket3365Test.java @@ -1,6 +1,6 @@ package io.swagger.v3.core.resolving; -import com.fasterxml.jackson.databind.ObjectMapper; +import tools.jackson.databind.ObjectMapper; import io.swagger.v3.core.converter.AnnotatedType; import io.swagger.v3.core.converter.ModelConverterContextImpl; import io.swagger.v3.core.jackson.ModelResolver; diff --git a/modules/swagger-core/src/test/java/io/swagger/v3/core/resolving/Ticket3853Test.java b/modules/swagger-core/src/test/java/io/swagger/v3/core/resolving/Ticket3853Test.java index a5c008808b..29452076da 100644 --- a/modules/swagger-core/src/test/java/io/swagger/v3/core/resolving/Ticket3853Test.java +++ b/modules/swagger-core/src/test/java/io/swagger/v3/core/resolving/Ticket3853Test.java @@ -4,7 +4,7 @@ import com.fasterxml.jackson.annotation.JsonSubTypes; import com.fasterxml.jackson.annotation.JsonTypeInfo; -import com.fasterxml.jackson.databind.ObjectMapper; +import tools.jackson.databind.ObjectMapper; import io.swagger.v3.core.converter.AnnotatedType; import io.swagger.v3.core.converter.ModelConverterContextImpl; import io.swagger.v3.core.jackson.ModelResolver; diff --git a/modules/swagger-core/src/test/java/io/swagger/v3/core/roundtrip/ComprehensiveRoundTripTest.java b/modules/swagger-core/src/test/java/io/swagger/v3/core/roundtrip/ComprehensiveRoundTripTest.java index e2ae0ea6a6..9b1b3ec3b1 100644 --- a/modules/swagger-core/src/test/java/io/swagger/v3/core/roundtrip/ComprehensiveRoundTripTest.java +++ b/modules/swagger-core/src/test/java/io/swagger/v3/core/roundtrip/ComprehensiveRoundTripTest.java @@ -1,7 +1,8 @@ package io.swagger.v3.core.roundtrip; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; +import tools.jackson.core.StreamReadFeature; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.ObjectMapper; import io.swagger.v3.core.util.Json; import io.swagger.v3.core.util.JsonAssert; import io.swagger.v3.core.util.Json31; @@ -23,6 +24,7 @@ import io.swagger.v3.oas.models.responses.ApiResponse; import io.swagger.v3.oas.models.responses.ApiResponses; import org.testng.annotations.Test; +import tools.jackson.databind.json.JsonMapper; import java.io.IOException; import java.util.HashMap; @@ -268,7 +270,9 @@ public void testBooleanSchemaRoundTrip() throws IOException { assertTrue(Boolean.TRUE.equals(deserializedOpenAPI.getComponents().getSchemas().get("BooleanSchema").getBooleanSchemaValue())); // Verify that the schema is serialized as a boolean value - ObjectMapper mapper = new ObjectMapper(); + ObjectMapper mapper = JsonMapper.builder() + .enable(StreamReadFeature.INCLUDE_SOURCE_IN_LOCATION) + .build(); JsonNode jsonNode = mapper.readTree(json); assertTrue(jsonNode.get("components").get("schemas").get("BooleanSchema").isBoolean()); assertTrue(jsonNode.get("components").get("schemas").get("BooleanSchema").asBoolean()); diff --git a/modules/swagger-core/src/test/java/io/swagger/v3/core/serialization/ComprehensiveSerializationTest.java b/modules/swagger-core/src/test/java/io/swagger/v3/core/serialization/ComprehensiveSerializationTest.java index 24d9489c06..fe42c09036 100644 --- a/modules/swagger-core/src/test/java/io/swagger/v3/core/serialization/ComprehensiveSerializationTest.java +++ b/modules/swagger-core/src/test/java/io/swagger/v3/core/serialization/ComprehensiveSerializationTest.java @@ -1,7 +1,7 @@ package io.swagger.v3.core.serialization; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.ObjectMapper; import io.swagger.v3.core.util.Json; import io.swagger.v3.core.util.Json31; import io.swagger.v3.core.util.Yaml; diff --git a/modules/swagger-core/src/test/java/io/swagger/v3/core/serialization/JsonSerializationTest.java b/modules/swagger-core/src/test/java/io/swagger/v3/core/serialization/JsonSerializationTest.java index 29163d0cca..f4d3c572d8 100644 --- a/modules/swagger-core/src/test/java/io/swagger/v3/core/serialization/JsonSerializationTest.java +++ b/modules/swagger-core/src/test/java/io/swagger/v3/core/serialization/JsonSerializationTest.java @@ -1,8 +1,9 @@ package io.swagger.v3.core.serialization; -import com.fasterxml.jackson.core.JsonFactory; -import com.fasterxml.jackson.dataformat.yaml.JacksonYAMLParseException; -import com.fasterxml.jackson.dataformat.yaml.YAMLFactory; +import org.snakeyaml.engine.v2.api.LoadSettings; +import tools.jackson.core.json.JsonFactory; +import tools.jackson.dataformat.yaml.JacksonYAMLParseException; +import tools.jackson.dataformat.yaml.YAMLFactory; import io.swagger.v3.core.matchers.SerializationMatchers; import io.swagger.v3.core.util.Json; import io.swagger.v3.core.util.ObjectMapperFactory; @@ -17,6 +18,7 @@ import io.swagger.v3.oas.models.servers.Server; import org.testng.annotations.Test; import org.yaml.snakeyaml.LoaderOptions; +import tools.jackson.core.TokenStreamFactory; import java.util.HashMap; import java.util.Map; @@ -125,10 +127,11 @@ public void testSerializeJSONWithCustomFactory() throws Exception { @Test public void testSerializeYAMLWithCustomFactory() throws Exception { // given - LoaderOptions loaderOptions = new LoaderOptions(); - loaderOptions.setCodePointLimit(5 * 1024 * 1024); + LoadSettings loadSettings = LoadSettings.builder() + .setCodePointLimit(5 * 1024 * 1024) + .build(); YAMLFactory yamlFactory = YAMLFactory.builder() - .loaderOptions(loaderOptions) + .loadSettings(loadSettings) .build(); final String yaml = ResourceUtils.loadClassResource(getClass(), "specFiles/null-example.yaml"); @@ -142,10 +145,11 @@ public void testSerializeYAMLWithCustomFactory() throws Exception { @Test(expectedExceptions = JacksonYAMLParseException.class) public void testSerializeYAMLWithCustomFactoryAndCodePointLimitReached() throws Exception { // given - LoaderOptions loaderOptions = new LoaderOptions(); - loaderOptions.setCodePointLimit(1); + LoadSettings loadSettings = LoadSettings.builder() + .setCodePointLimit(1) + .build(); YAMLFactory yamlFactory = YAMLFactory.builder() - .loaderOptions(loaderOptions) + .loadSettings(loadSettings) .build(); final String yaml = ResourceUtils.loadClassResource(getClass(), "specFiles/null-example.yaml"); diff --git a/modules/swagger-core/src/test/java/io/swagger/v3/core/serialization/ModelSerializerTest.java b/modules/swagger-core/src/test/java/io/swagger/v3/core/serialization/ModelSerializerTest.java index b13386269c..4259f54ce0 100644 --- a/modules/swagger-core/src/test/java/io/swagger/v3/core/serialization/ModelSerializerTest.java +++ b/modules/swagger-core/src/test/java/io/swagger/v3/core/serialization/ModelSerializerTest.java @@ -1,7 +1,6 @@ package io.swagger.v3.core.serialization; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.ObjectMapper; +import tools.jackson.databind.ObjectMapper; import io.swagger.v3.core.converter.ModelConverters; import io.swagger.v3.core.matchers.SerializationMatchers; import io.swagger.v3.core.oas.models.Car; @@ -17,6 +16,7 @@ import io.swagger.v3.oas.models.media.Schema; import io.swagger.v3.oas.models.media.StringSchema; import org.testng.annotations.Test; +import tools.jackson.core.JacksonException; import java.io.IOException; import java.math.BigDecimal; @@ -34,7 +34,7 @@ public class ModelSerializerTest { private final ObjectMapper m = Json.mapper(); @Test(description = "it should convert a model") - public void convertModel() throws JsonProcessingException { + public void convertModel() throws JacksonException { final Schema pet = new Schema(); final Map props = new LinkedHashMap(); props.put("intValue", new IntegerSchema()); diff --git a/modules/swagger-core/src/test/java/io/swagger/v3/core/serialization/OpenAPI3_1SerializationTest.java b/modules/swagger-core/src/test/java/io/swagger/v3/core/serialization/OpenAPI3_1SerializationTest.java index 53e338d0a8..69ee528b31 100644 --- a/modules/swagger-core/src/test/java/io/swagger/v3/core/serialization/OpenAPI3_1SerializationTest.java +++ b/modules/swagger-core/src/test/java/io/swagger/v3/core/serialization/OpenAPI3_1SerializationTest.java @@ -1,10 +1,11 @@ package io.swagger.v3.core.serialization; -import com.fasterxml.jackson.core.JsonFactory; -import com.fasterxml.jackson.core.util.DefaultIndenter; -import com.fasterxml.jackson.databind.json.JsonMapper; -import com.fasterxml.jackson.dataformat.yaml.JacksonYAMLParseException; -import com.fasterxml.jackson.dataformat.yaml.YAMLFactory; +import org.snakeyaml.engine.v2.api.LoadSettings; +import tools.jackson.core.json.JsonFactory; +import tools.jackson.core.util.DefaultIndenter; +import tools.jackson.databind.json.JsonMapper; +import tools.jackson.dataformat.yaml.JacksonYAMLParseException; +import tools.jackson.dataformat.yaml.YAMLFactory; import io.swagger.v3.core.matchers.SerializationMatchers; import io.swagger.v3.core.util.*; import io.swagger.v3.oas.models.Components; @@ -33,6 +34,7 @@ import org.slf4j.LoggerFactory; import org.testng.annotations.Test; import org.yaml.snakeyaml.LoaderOptions; +import tools.jackson.core.TokenStreamFactory; import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertNotNull; @@ -1519,10 +1521,11 @@ public void testBooleanAdditionalPropertiesSerialization() throws Exception{ @Test(expectedExceptions = JacksonYAMLParseException.class) public void testSerializeYAML31WithCustomFactoryAndCodePointLimitReached() throws Exception { // given - LoaderOptions loaderOptions = new LoaderOptions(); - loaderOptions.setCodePointLimit(1); + LoadSettings loadSettings = LoadSettings.builder() + .setCodePointLimit(1) + .build(); YAMLFactory yamlFactory = YAMLFactory.builder() - .loaderOptions(loaderOptions) + .loadSettings(loadSettings) .build(); final String yaml = ResourceUtils.loadClassResource(getClass(), "specFiles/petstore-3.0.yaml"); diff --git a/modules/swagger-core/src/test/java/io/swagger/v3/core/serialization/ParameterSerializationTest.java b/modules/swagger-core/src/test/java/io/swagger/v3/core/serialization/ParameterSerializationTest.java index 8e24bde938..4fd5b0488b 100644 --- a/modules/swagger-core/src/test/java/io/swagger/v3/core/serialization/ParameterSerializationTest.java +++ b/modules/swagger-core/src/test/java/io/swagger/v3/core/serialization/ParameterSerializationTest.java @@ -1,6 +1,6 @@ package io.swagger.v3.core.serialization; -import com.fasterxml.jackson.databind.ObjectMapper; +import tools.jackson.databind.ObjectMapper; import io.swagger.v3.core.matchers.SerializationMatchers; import io.swagger.v3.core.util.Json; import io.swagger.v3.core.util.Yaml; diff --git a/modules/swagger-core/src/test/java/io/swagger/v3/core/serialization/YamlSerializerTest.java b/modules/swagger-core/src/test/java/io/swagger/v3/core/serialization/YamlSerializerTest.java index d2f99e059a..903b5dfd03 100644 --- a/modules/swagger-core/src/test/java/io/swagger/v3/core/serialization/YamlSerializerTest.java +++ b/modules/swagger-core/src/test/java/io/swagger/v3/core/serialization/YamlSerializerTest.java @@ -1,6 +1,6 @@ package io.swagger.v3.core.serialization; -import com.fasterxml.jackson.databind.JsonNode; +import tools.jackson.databind.JsonNode; import io.swagger.v3.core.util.Yaml; import org.testng.annotations.Test; diff --git a/modules/swagger-core/src/test/java/io/swagger/v3/core/serialization/properties/PropertySerializationTest.java b/modules/swagger-core/src/test/java/io/swagger/v3/core/serialization/properties/PropertySerializationTest.java index 3cd5ea4022..514dc4daec 100644 --- a/modules/swagger-core/src/test/java/io/swagger/v3/core/serialization/properties/PropertySerializationTest.java +++ b/modules/swagger-core/src/test/java/io/swagger/v3/core/serialization/properties/PropertySerializationTest.java @@ -1,6 +1,6 @@ package io.swagger.v3.core.serialization.properties; -import com.fasterxml.jackson.databind.ObjectMapper; +import tools.jackson.databind.ObjectMapper; import io.swagger.v3.core.util.Json; import io.swagger.v3.core.util.JsonAssert; import io.swagger.v3.oas.models.media.ArraySchema; diff --git a/modules/swagger-core/src/test/java/io/swagger/v3/core/util/JsonAssert.java b/modules/swagger-core/src/test/java/io/swagger/v3/core/util/JsonAssert.java index f9ff7c2047..62aa0cfbab 100644 --- a/modules/swagger-core/src/test/java/io/swagger/v3/core/util/JsonAssert.java +++ b/modules/swagger-core/src/test/java/io/swagger/v3/core/util/JsonAssert.java @@ -1,7 +1,7 @@ package io.swagger.v3.core.util; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.ObjectMapper; import static org.testng.Assert.assertTrue; public final class JsonAssert { diff --git a/modules/swagger-core/src/test/java/io/swagger/v3/core/util/ReferenceTypeUtilsTest.java b/modules/swagger-core/src/test/java/io/swagger/v3/core/util/ReferenceTypeUtilsTest.java index 8d10b07d7b..186f7be40f 100644 --- a/modules/swagger-core/src/test/java/io/swagger/v3/core/util/ReferenceTypeUtilsTest.java +++ b/modules/swagger-core/src/test/java/io/swagger/v3/core/util/ReferenceTypeUtilsTest.java @@ -1,7 +1,7 @@ package io.swagger.v3.core.util; -import com.fasterxml.jackson.databind.JavaType; -import com.fasterxml.jackson.databind.type.TypeFactory; +import tools.jackson.databind.JavaType; +import tools.jackson.databind.type.TypeFactory; import io.swagger.v3.core.converter.AnnotatedType; import org.testng.annotations.Test; @@ -19,9 +19,9 @@ public class ReferenceTypeUtilsTest { @Test(description = "AtomicReference should be reference type") public void testIsReferenceTypeWithAtomicReference() { - final JavaType referredType = TypeFactory.defaultInstance().constructType(String.class); + final JavaType referredType = TypeFactory.createDefaultInstance().constructType(String.class); final Class rawType = AtomicReference.class; - final JavaType atomicReferenceType = TypeFactory.defaultInstance().constructReferenceType(rawType, referredType); + final JavaType atomicReferenceType = TypeFactory.createDefaultInstance().constructReferenceType(rawType, referredType); final boolean actualIsReferenceType = ReferenceTypeUtils._isReferenceType(atomicReferenceType); @@ -30,10 +30,10 @@ public void testIsReferenceTypeWithAtomicReference() { @Test(description = "AtomicReference JavaType should be unwrapped") public void testUnwrapWithAtomicReferenceAndJavaType() { - final JavaType expectedReferredType = TypeFactory.defaultInstance().constructType(String.class); + final JavaType expectedReferredType = TypeFactory.createDefaultInstance().constructType(String.class); final Class rawType = AtomicReference.class; - final JavaType atomicReferenceType = TypeFactory.defaultInstance().constructReferenceType(rawType, expectedReferredType); + final JavaType atomicReferenceType = TypeFactory.createDefaultInstance().constructReferenceType(rawType, expectedReferredType); final AnnotatedType actualUnwrappedType = ReferenceTypeUtils.unwrapReference(new AnnotatedType(atomicReferenceType)); @@ -42,7 +42,7 @@ public void testUnwrapWithAtomicReferenceAndJavaType() { @Test(description = "AtomicReference should be unwrapped when read from Java bean") public void testUnwrapWithAtomicReferenceMemberFromJavaBean() throws Exception { - final JavaType expectedReferredType = TypeFactory.defaultInstance().constructType(BigDecimal.class); + final JavaType expectedReferredType = TypeFactory.createDefaultInstance().constructType(BigDecimal.class); final Type genericType = TypeWithAtomicReferenceMember.class.getDeclaredField("member").getGenericType(); final AnnotatedType actualUnwrappedType = ReferenceTypeUtils.unwrapReference(new AnnotatedType(genericType)); diff --git a/modules/swagger-core/src/test/java/io/swagger/v3/core/util/TestUtils.java b/modules/swagger-core/src/test/java/io/swagger/v3/core/util/TestUtils.java index 8535d8bae5..c3ea3e5928 100644 --- a/modules/swagger-core/src/test/java/io/swagger/v3/core/util/TestUtils.java +++ b/modules/swagger-core/src/test/java/io/swagger/v3/core/util/TestUtils.java @@ -1,6 +1,7 @@ package io.swagger.v3.core.util; -import com.fasterxml.jackson.databind.ObjectMapper; +import tools.jackson.core.JacksonException; +import tools.jackson.databind.ObjectMapper; import org.apache.commons.io.IOUtils; import java.io.IOException; @@ -29,7 +30,7 @@ private static T deserializeFileFromClasspath(String path, Class type, Ob try { T result = objectMapper.readValue(contents, type); return result; - } catch (IOException e) { + } catch (JacksonException e) { throw new RuntimeException("Could not deserialize contents into type: " + type, e); } } diff --git a/modules/swagger-gradle-plugin/build.gradle b/modules/swagger-gradle-plugin/build.gradle index 85c953718c..3c60af5a23 100644 --- a/modules/swagger-gradle-plugin/build.gradle +++ b/modules/swagger-gradle-plugin/build.gradle @@ -19,7 +19,7 @@ repositories { } compileJava { - options.release = 8 + options.release = 17 } dependencies { diff --git a/modules/swagger-integration/src/main/java/io/swagger/v3/oas/integration/GenericOpenApiContext.java b/modules/swagger-integration/src/main/java/io/swagger/v3/oas/integration/GenericOpenApiContext.java index f7681cb1ac..dffa3dc20e 100644 --- a/modules/swagger-integration/src/main/java/io/swagger/v3/oas/integration/GenericOpenApiContext.java +++ b/modules/swagger-integration/src/main/java/io/swagger/v3/oas/integration/GenericOpenApiContext.java @@ -6,10 +6,10 @@ import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonPropertyOrder; -import com.fasterxml.jackson.databind.MapperFeature; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.SerializationFeature; -import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import tools.jackson.databind.MapperFeature; +import tools.jackson.databind.ObjectMapper; +import tools.jackson.databind.SerializationFeature; +import tools.jackson.databind.annotation.JsonSerialize; import io.swagger.v3.core.converter.ModelConverter; import io.swagger.v3.core.converter.ModelConverters; import io.swagger.v3.core.filter.OpenAPI31SpecFilter; @@ -35,6 +35,7 @@ import org.apache.commons.lang3.tuple.ImmutablePair; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import tools.jackson.databind.cfg.MapperBuilder; import java.io.IOException; import java.math.BigDecimal; @@ -542,34 +543,38 @@ public T init() throws OpenApiConfigurationException { } if (outputJsonMapper == null) { if (Boolean.TRUE.equals(openApiConfiguration.isOpenAPI31())) { - outputJsonMapper = Json31.mapper().copy(); + outputJsonMapper = Json31.mapper(); } else { - outputJsonMapper = Json.mapper().copy(); + outputJsonMapper = Json.mapper(); } } if (outputYamlMapper == null) { if (Boolean.TRUE.equals(openApiConfiguration.isOpenAPI31())) { - outputYamlMapper = Yaml31.mapper().copy(); + outputYamlMapper = Yaml31.mapper(); } else { - outputYamlMapper = Yaml.mapper().copy(); + outputYamlMapper = Yaml.mapper(); } } if (openApiConfiguration.isSortOutput() != null && openApiConfiguration.isSortOutput()) { - outputJsonMapper.configure(SerializationFeature.ORDER_MAP_ENTRIES_BY_KEYS, true); - outputJsonMapper.configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY, true); - outputYamlMapper.configure(SerializationFeature.ORDER_MAP_ENTRIES_BY_KEYS, true); - outputYamlMapper.configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY, true); + MapperBuilder> jsonMapperBuilder = outputJsonMapper.rebuild(); + MapperBuilder> yamlMapperBuilder = outputYamlMapper.rebuild(); + jsonMapperBuilder.configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY, true); + yamlMapperBuilder.configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY, true); + jsonMapperBuilder.configure(SerializationFeature.ORDER_MAP_ENTRIES_BY_KEYS, true); + yamlMapperBuilder.configure(SerializationFeature.ORDER_MAP_ENTRIES_BY_KEYS, true); if (Boolean.TRUE.equals(openApiConfiguration.isOpenAPI31())) { - outputJsonMapper.addMixIn(OpenAPI.class, SortedOpenAPIMixin31.class); - outputJsonMapper.addMixIn(Schema.class, SortedSchemaMixin31.class); - outputYamlMapper.addMixIn(OpenAPI.class, SortedOpenAPIMixin31.class); - outputYamlMapper.addMixIn(Schema.class, SortedSchemaMixin31.class); + jsonMapperBuilder.addMixIn(OpenAPI.class, SortedOpenAPIMixin31.class); + jsonMapperBuilder.addMixIn(Schema.class, SortedSchemaMixin31.class); + yamlMapperBuilder.addMixIn(OpenAPI.class, SortedOpenAPIMixin31.class); + yamlMapperBuilder.addMixIn(Schema.class, SortedSchemaMixin31.class); } else { - outputJsonMapper.addMixIn(OpenAPI.class, SortedOpenAPIMixin.class); - outputJsonMapper.addMixIn(Schema.class, SortedSchemaMixin.class); - outputYamlMapper.addMixIn(OpenAPI.class, SortedOpenAPIMixin.class); - outputYamlMapper.addMixIn(Schema.class, SortedSchemaMixin.class); + jsonMapperBuilder.addMixIn(OpenAPI.class, SortedOpenAPIMixin.class); + jsonMapperBuilder.addMixIn(Schema.class, SortedSchemaMixin.class); + yamlMapperBuilder.addMixIn(OpenAPI.class, SortedOpenAPIMixin.class); + yamlMapperBuilder.addMixIn(Schema.class, SortedSchemaMixin.class); } + outputJsonMapper = jsonMapperBuilder.build(); + outputYamlMapper = yamlMapperBuilder.build(); } } catch (Exception e) { LOGGER.error("error initializing context: " + e.getMessage(), e); @@ -583,8 +588,8 @@ public T init() throws OpenApiConfigurationException { objectMapperProcessor.processJsonObjectMapper(mapper); ModelConverters.getInstance(Boolean.TRUE.equals(openApiConfiguration.isOpenAPI31()), openApiConfiguration.getSchemaResolution()).addConverter(new ModelResolver(mapper)); - objectMapperProcessor.processOutputJsonObjectMapper(outputJsonMapper); - objectMapperProcessor.processOutputYamlObjectMapper(outputYamlMapper); + outputJsonMapper = objectMapperProcessor.processOutputJsonObjectMapper(outputJsonMapper); + outputYamlMapper = objectMapperProcessor.processOutputYamlObjectMapper(outputYamlMapper); } } catch (Exception e) { LOGGER.error("error configuring objectMapper: " + e.getMessage(), e); diff --git a/modules/swagger-integration/src/main/java/io/swagger/v3/oas/integration/IntegrationObjectMapperFactory.java b/modules/swagger-integration/src/main/java/io/swagger/v3/oas/integration/IntegrationObjectMapperFactory.java index b4a481b911..b638d90e78 100644 --- a/modules/swagger-integration/src/main/java/io/swagger/v3/oas/integration/IntegrationObjectMapperFactory.java +++ b/modules/swagger-integration/src/main/java/io/swagger/v3/oas/integration/IntegrationObjectMapperFactory.java @@ -1,6 +1,6 @@ package io.swagger.v3.oas.integration; -import com.fasterxml.jackson.databind.ObjectMapper; +import tools.jackson.databind.ObjectMapper; import io.swagger.v3.core.util.ObjectMapperFactory; public class IntegrationObjectMapperFactory extends ObjectMapperFactory { diff --git a/modules/swagger-integration/src/main/java/io/swagger/v3/oas/integration/api/ObjectMapperProcessor.java b/modules/swagger-integration/src/main/java/io/swagger/v3/oas/integration/api/ObjectMapperProcessor.java index 0c25399a21..a748891d9b 100644 --- a/modules/swagger-integration/src/main/java/io/swagger/v3/oas/integration/api/ObjectMapperProcessor.java +++ b/modules/swagger-integration/src/main/java/io/swagger/v3/oas/integration/api/ObjectMapperProcessor.java @@ -1,6 +1,6 @@ package io.swagger.v3.oas.integration.api; -import com.fasterxml.jackson.databind.ObjectMapper; +import tools.jackson.databind.ObjectMapper; /** * @since 2.0.6 @@ -17,14 +17,17 @@ public interface ObjectMapperProcessor { default void processYamlObjectMapper(ObjectMapper mapper) {} /** + * @return * @since 2.1.6 */ - default void processOutputJsonObjectMapper(ObjectMapper mapper) {} + default ObjectMapper processOutputJsonObjectMapper(ObjectMapper mapper) { + return mapper; + } /** * @since 2.1.6 */ - default void processOutputYamlObjectMapper(ObjectMapper mapper) { - processOutputJsonObjectMapper(mapper); + default ObjectMapper processOutputYamlObjectMapper(ObjectMapper mapper) { + return processOutputJsonObjectMapper(mapper); } } diff --git a/modules/swagger-integration/src/main/java/io/swagger/v3/oas/integration/api/OpenApiContext.java b/modules/swagger-integration/src/main/java/io/swagger/v3/oas/integration/api/OpenApiContext.java index 31b4dce94a..57671c4364 100644 --- a/modules/swagger-integration/src/main/java/io/swagger/v3/oas/integration/api/OpenApiContext.java +++ b/modules/swagger-integration/src/main/java/io/swagger/v3/oas/integration/api/OpenApiContext.java @@ -1,6 +1,6 @@ package io.swagger.v3.oas.integration.api; -import com.fasterxml.jackson.databind.ObjectMapper; +import tools.jackson.databind.ObjectMapper; import io.swagger.v3.core.converter.ModelConverter; import io.swagger.v3.oas.integration.OpenApiConfigurationException; import io.swagger.v3.oas.models.OpenAPI; diff --git a/modules/swagger-java17-support/pom.xml b/modules/swagger-java17-support/pom.xml index 7303343b8b..db7c069f88 100644 --- a/modules/swagger-java17-support/pom.xml +++ b/modules/swagger-java17-support/pom.xml @@ -77,7 +77,7 @@ org.apache.maven.plugins maven-compiler-plugin - 3.11.0 + 3.14.1 17 diff --git a/modules/swagger-java17-support/src/test/java/io/swagger/v3/java17/matchers/SerializationMatchers.java b/modules/swagger-java17-support/src/test/java/io/swagger/v3/java17/matchers/SerializationMatchers.java index 01e5c00de2..42f23a02b2 100644 --- a/modules/swagger-java17-support/src/test/java/io/swagger/v3/java17/matchers/SerializationMatchers.java +++ b/modules/swagger-java17-support/src/test/java/io/swagger/v3/java17/matchers/SerializationMatchers.java @@ -1,9 +1,10 @@ package io.swagger.v3.java17.matchers; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.node.NumericNode; -import com.fasterxml.jackson.databind.node.ObjectNode; +import tools.jackson.core.JacksonException; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.ObjectMapper; +import tools.jackson.databind.node.NumericNode; +import tools.jackson.databind.node.ObjectNode; import io.swagger.v3.core.util.Json; import io.swagger.v3.core.util.Json31; import io.swagger.v3.core.util.Yaml; @@ -44,7 +45,7 @@ private static void apply(Object objectToSerialize, String str, ObjectMapper map ObjectNode rhs = null; try { rhs = mapper.readValue(str, ObjectNode.class); - } catch (IOException e) { + } catch (JacksonException e) { LOGGER.error("Failed to read value", e); } if (exactMatch || !lhs.equals(new ObjectNodeComparator(), rhs)) { @@ -58,7 +59,7 @@ private static void apply31(Object objectToSerialize, String str, ObjectMapper m ObjectNode rhs = null; try { rhs = mapper.readValue(str, ObjectNode.class); - } catch (IOException e) { + } catch (JacksonException e) { LOGGER.error("Failed to read value", e); } if (!lhs.equals(new ObjectNodeComparator(), rhs)) { @@ -77,7 +78,7 @@ public int compare(JsonNode o1, JsonNode o2) { double d2 = ((NumericNode) o2).asDouble(); return Double.compare(d1, d2); } - int comp = o1.asText().compareTo(o2.asText()); + int comp = o1.asString().compareTo(o2.asString()); if (comp == 0) { return Integer.compare(o1.hashCode(), o2.hashCode()); } diff --git a/modules/swagger-java17-support/src/test/java/io/swagger/v3/java17/resolving/SwaggerTestBase.java b/modules/swagger-java17-support/src/test/java/io/swagger/v3/java17/resolving/SwaggerTestBase.java index 427895be63..332917859b 100644 --- a/modules/swagger-java17-support/src/test/java/io/swagger/v3/java17/resolving/SwaggerTestBase.java +++ b/modules/swagger-java17-support/src/test/java/io/swagger/v3/java17/resolving/SwaggerTestBase.java @@ -1,13 +1,15 @@ package io.swagger.v3.java17.resolving; import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.core.util.DefaultPrettyPrinter; -import com.fasterxml.jackson.databind.DeserializationFeature; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.SerializationFeature; +import tools.jackson.core.util.DefaultPrettyPrinter; +import tools.jackson.databind.MapperFeature; +import tools.jackson.databind.ObjectMapper; import io.swagger.v3.core.jackson.ModelResolver; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import tools.jackson.databind.cfg.EnumFeature; +import tools.jackson.databind.introspect.DefaultAccessorNamingStrategy; +import tools.jackson.databind.json.JsonMapper; public abstract class SwaggerTestBase { static ObjectMapper mapper; @@ -15,10 +17,15 @@ public abstract class SwaggerTestBase { public static ObjectMapper mapper() { if (mapper == null) { - mapper = new ObjectMapper(); - mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); - mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false); - mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); + mapper = JsonMapper.builder() + .disable(EnumFeature.WRITE_ENUMS_USING_TO_STRING) + .configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY, false) + .changeDefaultPropertyInclusion(incl -> incl + .withContentInclusion(JsonInclude.Include.NON_NULL) + .withValueInclusion(JsonInclude.Include.NON_NULL)) + .accessorNaming(new DefaultAccessorNamingStrategy.Provider() + .withFirstCharAcceptance(true, true)) + .build(); } return mapper; } @@ -29,7 +36,7 @@ protected ModelResolver modelResolver() { protected void prettyPrint(Object o) { try { - LOGGER.debug(mapper().writer(new DefaultPrettyPrinter()).writeValueAsString(o)); + LOGGER.debug(mapper().writerWithDefaultPrettyPrinter().writeValueAsString(o)); } catch (Exception e) { LOGGER.error("Failed to pretty print object", e); } diff --git a/modules/swagger-jaxrs2/pom.xml b/modules/swagger-jaxrs2/pom.xml index 9d3f654f74..42d9143fa0 100644 --- a/modules/swagger-jaxrs2/pom.xml +++ b/modules/swagger-jaxrs2/pom.xml @@ -146,8 +146,9 @@ provided - com.fasterxml.jackson.core + tools.jackson.core jackson-databind + 3.0.3 io.github.classgraph @@ -293,9 +294,14 @@ - com.fasterxml.jackson.jaxrs + tools.jackson.jaxrs jackson-jaxrs-json-provider ${jackson-version} + + tools.jackson.module + jackson-module-jaxb-annotations + ${jackson-version} + diff --git a/modules/swagger-jaxrs2/src/main/java/io/swagger/v3/jaxrs2/DefaultParameterExtension.java b/modules/swagger-jaxrs2/src/main/java/io/swagger/v3/jaxrs2/DefaultParameterExtension.java index bf6bd03dff..9058f34718 100644 --- a/modules/swagger-jaxrs2/src/main/java/io/swagger/v3/jaxrs2/DefaultParameterExtension.java +++ b/modules/swagger-jaxrs2/src/main/java/io/swagger/v3/jaxrs2/DefaultParameterExtension.java @@ -1,12 +1,12 @@ package io.swagger.v3.jaxrs2; import com.fasterxml.jackson.annotation.JsonView; -import com.fasterxml.jackson.databind.BeanDescription; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.introspect.AnnotatedField; -import com.fasterxml.jackson.databind.introspect.AnnotatedMethod; -import com.fasterxml.jackson.databind.introspect.AnnotationMap; -import com.fasterxml.jackson.databind.introspect.BeanPropertyDefinition; +import tools.jackson.databind.BeanDescription; +import tools.jackson.databind.ObjectMapper; +import tools.jackson.databind.introspect.AnnotatedField; +import tools.jackson.databind.introspect.AnnotatedMethod; +import tools.jackson.databind.introspect.AnnotationMap; +import tools.jackson.databind.introspect.BeanPropertyDefinition; import io.swagger.v3.core.util.Json; import io.swagger.v3.core.util.ParameterProcessor; @@ -30,6 +30,7 @@ import java.util.Iterator; import java.util.List; import java.util.Set; +import java.util.stream.Stream; public class DefaultParameterExtension extends AbstractOpenAPIExtension { private static final String QUERY_PARAM = "query"; @@ -165,7 +166,7 @@ private boolean handleAdditionalAnnotation(List parameters, List properties = beanDesc.findProperties(); for (final BeanPropertyDefinition propDef : properties) { @@ -179,14 +180,9 @@ private boolean handleAdditionalAnnotation(List parameters, List !paramAnnotations.contains(fieldAnnotation)) + .forEach(paramAnnotations::add); } // Gather the setter's details but only the ones we need @@ -196,14 +192,9 @@ private boolean handleAdditionalAnnotation(List parameters, List !paramAnnotations.contains(fieldAnnotation)) + .forEach(paramAnnotations::add); } // Gather the getter's details but only the ones we need @@ -212,14 +203,9 @@ private boolean handleAdditionalAnnotation(List parameters, List !paramAnnotations.contains(fieldAnnotation)) + .forEach(paramAnnotations::add); } if (paramType == null) { diff --git a/modules/swagger-jaxrs2/src/main/java/io/swagger/v3/jaxrs2/Reader.java b/modules/swagger-jaxrs2/src/main/java/io/swagger/v3/jaxrs2/Reader.java index b15115aaf7..df6f93f68c 100644 --- a/modules/swagger-jaxrs2/src/main/java/io/swagger/v3/jaxrs2/Reader.java +++ b/modules/swagger-jaxrs2/src/main/java/io/swagger/v3/jaxrs2/Reader.java @@ -1,11 +1,12 @@ package io.swagger.v3.jaxrs2; import com.fasterxml.jackson.annotation.JsonView; -import com.fasterxml.jackson.databind.BeanDescription; -import com.fasterxml.jackson.databind.JavaType; -import com.fasterxml.jackson.databind.introspect.AnnotatedMethod; -import com.fasterxml.jackson.databind.introspect.AnnotatedParameter; -import com.fasterxml.jackson.databind.type.TypeFactory; +import tools.jackson.core.JacksonException; +import tools.jackson.databind.BeanDescription; +import tools.jackson.databind.JavaType; +import tools.jackson.databind.introspect.AnnotatedMethod; +import tools.jackson.databind.introspect.AnnotatedParameter; +import tools.jackson.databind.type.TypeFactory; import io.swagger.v3.core.converter.AnnotatedType; import io.swagger.v3.core.converter.ModelConverters; import io.swagger.v3.core.converter.ResolvedSchema; @@ -412,12 +413,12 @@ public OpenAPI read(Class cls, Optional classExternalDocumentation = AnnotationsUtils.getExternalDocumentation(apiExternalDocs); - JavaType classType = TypeFactory.defaultInstance().constructType(cls); + JavaType classType = TypeFactory.createDefaultInstance().constructType(cls); BeanDescription bd; if (openapi31) { - bd = Json31.mapper().getSerializationConfig().introspect(classType); + bd = Json31.mapper()._serializationContext().introspectBeanDescription(classType); } else { - bd = Json.mapper().getSerializationConfig().introspect(classType); + bd = Json.mapper()._serializationContext().introspectBeanDescription(classType); } final List globalParameters = new ArrayList<>(); @@ -539,7 +540,7 @@ public OpenAPI read(Class cls, if (annotatedMethod == null) { // annotatedMethod not null only when method with 0-2 parameters Type[] genericParameterTypes = method.getGenericParameterTypes(); for (int i = 0; i < genericParameterTypes.length; i++) { - final Type type = TypeFactory.defaultInstance().constructType(genericParameterTypes[i], cls); + final Type type = TypeFactory.createDefaultInstance().constructType(genericParameterTypes[i]); io.swagger.v3.oas.annotations.Parameter paramAnnotation = AnnotationsUtils.getAnnotation(io.swagger.v3.oas.annotations.Parameter.class, paramAnnotations[i]); Type paramType = ParameterProcessor.getParameterType(paramAnnotation, true); if (paramType == null) { @@ -569,7 +570,7 @@ public OpenAPI read(Class cls, } else { for (int i = 0; i < annotatedMethod.getParameterCount(); i++) { AnnotatedParameter param = annotatedMethod.getParameter(i); - final Type type = TypeFactory.defaultInstance().constructType(param.getParameterType(), cls); + final Type type = TypeFactory.createDefaultInstance().constructType(param.getType()); io.swagger.v3.oas.annotations.Parameter paramAnnotation = AnnotationsUtils.getAnnotation(io.swagger.v3.oas.annotations.Parameter.class, paramAnnotations[i]); Type paramType = ParameterProcessor.getParameterType(paramAnnotation, true); if (paramType == null) { @@ -888,7 +889,7 @@ public Operation parseMethod( Method method, List globalParameters, JsonView jsonViewAnnotation) { - JavaType classType = TypeFactory.defaultInstance().constructType(method.getDeclaringClass()); + JavaType classType = TypeFactory.createDefaultInstance().constructType(method.getDeclaringClass()); return parseMethod( classType.getClass(), method, @@ -925,7 +926,7 @@ public Operation parseMethod( ApiResponses parentResponses, JsonView jsonViewAnnotation, io.swagger.v3.oas.annotations.responses.ApiResponse[] classResponses) { - JavaType classType = TypeFactory.defaultInstance().constructType(method.getDeclaringClass()); + JavaType classType = TypeFactory.createDefaultInstance().constructType(method.getDeclaringClass()); return parseMethod( classType.getClass(), method, @@ -963,7 +964,7 @@ public Operation parseMethod( JsonView jsonViewAnnotation, io.swagger.v3.oas.annotations.responses.ApiResponse[] classResponses, AnnotatedMethod annotatedMethod) { - JavaType classType = TypeFactory.defaultInstance().constructType(method.getDeclaringClass()); + JavaType classType = TypeFactory.createDefaultInstance().constructType(method.getDeclaringClass()); return parseMethod( classType.getClass(), method, @@ -1265,7 +1266,7 @@ private MediaType clone(MediaType mediaType) { } else { mediaType = Json.mapper().readValue(Json.pretty(mediaType), MediaType.class); } - } catch (IOException e) { + } catch (JacksonException e) { LOGGER.error("Could not clone mediaType", e); } return mediaType; diff --git a/modules/swagger-jaxrs2/src/main/java/io/swagger/v3/jaxrs2/ext/AbstractOpenAPIExtension.java b/modules/swagger-jaxrs2/src/main/java/io/swagger/v3/jaxrs2/ext/AbstractOpenAPIExtension.java index a645766c3c..498a1faeb8 100644 --- a/modules/swagger-jaxrs2/src/main/java/io/swagger/v3/jaxrs2/ext/AbstractOpenAPIExtension.java +++ b/modules/swagger-jaxrs2/src/main/java/io/swagger/v3/jaxrs2/ext/AbstractOpenAPIExtension.java @@ -1,8 +1,8 @@ package io.swagger.v3.jaxrs2.ext; import com.fasterxml.jackson.annotation.JsonView; -import com.fasterxml.jackson.databind.JavaType; -import com.fasterxml.jackson.databind.type.TypeFactory; +import tools.jackson.databind.JavaType; +import tools.jackson.databind.type.TypeFactory; import io.swagger.v3.core.util.Configuration; import io.swagger.v3.jaxrs2.ResolvedParameter; import io.swagger.v3.oas.models.Components; @@ -65,7 +65,7 @@ protected boolean shouldIgnoreType(Type type, Set typesToSkip) { } protected JavaType constructType(Type type) { - return TypeFactory.defaultInstance().constructType(type); + return TypeFactory.createDefaultInstance().constructType(type); } @Override diff --git a/modules/swagger-jaxrs2/src/main/java/io/swagger/v3/jaxrs2/integration/OpenApiServlet.java b/modules/swagger-jaxrs2/src/main/java/io/swagger/v3/jaxrs2/integration/OpenApiServlet.java index a246f1dc99..4718cb29e4 100644 --- a/modules/swagger-jaxrs2/src/main/java/io/swagger/v3/jaxrs2/integration/OpenApiServlet.java +++ b/modules/swagger-jaxrs2/src/main/java/io/swagger/v3/jaxrs2/integration/OpenApiServlet.java @@ -1,6 +1,6 @@ package io.swagger.v3.jaxrs2.integration; -import com.fasterxml.jackson.core.util.DefaultPrettyPrinter; +import tools.jackson.core.util.DefaultPrettyPrinter; import io.swagger.v3.core.filter.OpenAPISpecFilter; import io.swagger.v3.core.filter.SpecFilter; import io.swagger.v3.jaxrs2.util.ServletUtils; @@ -86,12 +86,12 @@ protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws Se if (type.equalsIgnoreCase("yaml")) { resp.setContentType(APPLICATION_YAML); try (PrintWriter pw = resp.getWriter()) { - pw.write(pretty ? ctx.getOutputYamlMapper().writer(new DefaultPrettyPrinter()).writeValueAsString(oas) : ctx.getOutputYamlMapper().writeValueAsString(oas)); + pw.write(pretty ? ctx.getOutputYamlMapper().writerWithDefaultPrettyPrinter().writeValueAsString(oas) : ctx.getOutputYamlMapper().writeValueAsString(oas)); } } else { resp.setContentType(APPLICATION_JSON); try (PrintWriter pw = resp.getWriter()) { - pw.write(pretty ? ctx.getOutputJsonMapper().writer(new DefaultPrettyPrinter()).writeValueAsString(oas) : ctx.getOutputJsonMapper().writeValueAsString(oas)); + pw.write(pretty ? ctx.getOutputJsonMapper().writerWithDefaultPrettyPrinter().writeValueAsString(oas) : ctx.getOutputJsonMapper().writeValueAsString(oas)); } } diff --git a/modules/swagger-jaxrs2/src/main/java/io/swagger/v3/jaxrs2/integration/SwaggerLoader.java b/modules/swagger-jaxrs2/src/main/java/io/swagger/v3/jaxrs2/integration/SwaggerLoader.java index c39bda56f7..856504bde5 100644 --- a/modules/swagger-jaxrs2/src/main/java/io/swagger/v3/jaxrs2/integration/SwaggerLoader.java +++ b/modules/swagger-jaxrs2/src/main/java/io/swagger/v3/jaxrs2/integration/SwaggerLoader.java @@ -1,6 +1,6 @@ package io.swagger.v3.jaxrs2.integration; -import com.fasterxml.jackson.core.util.DefaultPrettyPrinter; +import tools.jackson.core.util.DefaultPrettyPrinter; import io.swagger.v3.core.filter.OpenAPISpecFilter; import io.swagger.v3.core.filter.SpecFilter; import io.swagger.v3.core.util.Configuration; @@ -401,14 +401,14 @@ public Map resolve() throws Exception{ String openapiYaml = null; if ("JSON".equals(outputFormat) || "JSONANDYAML".equals(outputFormat)) { if (prettyPrint != null && prettyPrint) { - openapiJson = context.getOutputJsonMapper().writer(new DefaultPrettyPrinter()).writeValueAsString(openAPI); + openapiJson = context.getOutputJsonMapper().writerWithDefaultPrettyPrinter().writeValueAsString(openAPI); } else { openapiJson = context.getOutputJsonMapper().writeValueAsString(openAPI); } } if ("YAML".equals(outputFormat) || "JSONANDYAML".equals(outputFormat)) { if (prettyPrint != null && prettyPrint) { - openapiYaml = context.getOutputYamlMapper().writer(new DefaultPrettyPrinter()).writeValueAsString(openAPI); + openapiYaml = context.getOutputYamlMapper().writerWithDefaultPrettyPrinter().writeValueAsString(openAPI); } else { openapiYaml = context.getOutputYamlMapper().writeValueAsString(openAPI); } diff --git a/modules/swagger-jaxrs2/src/main/java/io/swagger/v3/jaxrs2/integration/resources/BaseOpenApiResource.java b/modules/swagger-jaxrs2/src/main/java/io/swagger/v3/jaxrs2/integration/resources/BaseOpenApiResource.java index 683309668f..19d76a8ce1 100644 --- a/modules/swagger-jaxrs2/src/main/java/io/swagger/v3/jaxrs2/integration/resources/BaseOpenApiResource.java +++ b/modules/swagger-jaxrs2/src/main/java/io/swagger/v3/jaxrs2/integration/resources/BaseOpenApiResource.java @@ -1,6 +1,6 @@ package io.swagger.v3.jaxrs2.integration.resources; -import com.fasterxml.jackson.core.util.DefaultPrettyPrinter; +import tools.jackson.core.util.DefaultPrettyPrinter; import io.swagger.v3.core.filter.OpenAPISpecFilter; import io.swagger.v3.core.filter.SpecFilter; import io.swagger.v3.jaxrs2.integration.JaxrsOpenApiContextBuilder; @@ -71,14 +71,14 @@ protected Response getOpenApi(HttpHeaders headers, if (StringUtils.isNotBlank(type) && type.trim().equalsIgnoreCase("yaml")) { return Response.status(Response.Status.OK) .entity(pretty ? - ctx.getOutputYamlMapper().writer(new DefaultPrettyPrinter()).writeValueAsString(oas) : + ctx.getOutputYamlMapper().writerWithDefaultPrettyPrinter().writeValueAsString(oas) : ctx.getOutputYamlMapper().writeValueAsString(oas)) .type("application/yaml") .build(); } else { return Response.status(Response.Status.OK) .entity(pretty ? - ctx.getOutputJsonMapper().writer(new DefaultPrettyPrinter()).writeValueAsString(oas) : + ctx.getOutputJsonMapper().writerWithDefaultPrettyPrinter().writeValueAsString(oas) : ctx.getOutputJsonMapper().writeValueAsString(oas)) .type(MediaType.APPLICATION_JSON_TYPE) .build(); diff --git a/modules/swagger-jaxrs2/src/test/java/io/swagger/v3/jaxrs2/BootstrapServlet.java b/modules/swagger-jaxrs2/src/test/java/io/swagger/v3/jaxrs2/BootstrapServlet.java index 8025e0d552..165a2f0d4b 100644 --- a/modules/swagger-jaxrs2/src/test/java/io/swagger/v3/jaxrs2/BootstrapServlet.java +++ b/modules/swagger-jaxrs2/src/test/java/io/swagger/v3/jaxrs2/BootstrapServlet.java @@ -1,6 +1,6 @@ package io.swagger.v3.jaxrs2; -import com.fasterxml.jackson.core.util.DefaultPrettyPrinter; +import tools.jackson.core.util.DefaultPrettyPrinter; import io.swagger.v3.jaxrs2.integration.JaxrsOpenApiContextBuilder; import io.swagger.v3.oas.integration.OpenApiConfigurationException; import io.swagger.v3.oas.integration.OpenApiContextLocator; @@ -68,7 +68,7 @@ protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws Se resp.setContentType("application/yaml"); try (PrintWriter pw = resp.getWriter()) { - pw.write(ctx.getOutputYamlMapper().writer(new DefaultPrettyPrinter()).writeValueAsString(oas)); + pw.write(ctx.getOutputYamlMapper().writerWithDefaultPrettyPrinter().writeValueAsString(oas)); } } } diff --git a/modules/swagger-jaxrs2/src/test/java/io/swagger/v3/jaxrs2/JaxbObjectMapperFactory.java b/modules/swagger-jaxrs2/src/test/java/io/swagger/v3/jaxrs2/JaxbObjectMapperFactory.java index b1e84c572d..0fbf748802 100644 --- a/modules/swagger-jaxrs2/src/test/java/io/swagger/v3/jaxrs2/JaxbObjectMapperFactory.java +++ b/modules/swagger-jaxrs2/src/test/java/io/swagger/v3/jaxrs2/JaxbObjectMapperFactory.java @@ -1,14 +1,13 @@ package io.swagger.v3.jaxrs2; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.module.jaxb.JaxbAnnotationModule; +import tools.jackson.databind.ObjectMapper; +import tools.jackson.module.jaxb.JaxbAnnotationModule; import io.swagger.v3.core.util.ObjectMapperFactory; public class JaxbObjectMapperFactory extends ObjectMapperFactory { public static ObjectMapper getMapper() { - ObjectMapper mapper = ObjectMapperFactory.createJson(); - mapper.registerModule(new JaxbAnnotationModule()); - return mapper; + return ObjectMapperFactory.createJson(mapperBuilder -> + mapperBuilder.addModule(new JaxbAnnotationModule())); } } diff --git a/modules/swagger-jaxrs2/src/test/java/io/swagger/v3/jaxrs2/JsonViewTest.java b/modules/swagger-jaxrs2/src/test/java/io/swagger/v3/jaxrs2/JsonViewTest.java index fca5f1d946..b0f2f831e2 100644 --- a/modules/swagger-jaxrs2/src/test/java/io/swagger/v3/jaxrs2/JsonViewTest.java +++ b/modules/swagger-jaxrs2/src/test/java/io/swagger/v3/jaxrs2/JsonViewTest.java @@ -14,7 +14,6 @@ import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonView; -import com.fasterxml.jackson.core.JsonProcessingException; import java.util.Arrays; import java.util.List; @@ -26,6 +25,7 @@ import javax.ws.rs.core.Response; import org.testng.annotations.Test; +import tools.jackson.core.JacksonException; import static org.testng.Assert.assertFalse; import static org.testng.Assert.assertTrue; @@ -157,7 +157,7 @@ public List getCars() { } @Test(description = "check awareness of JsonView") - public void shouldSerializeTypeParameter() throws JsonProcessingException { + public void shouldSerializeTypeParameter() throws JacksonException { Reader reader = new Reader(new OpenAPI()); diff --git a/modules/swagger-jaxrs2/src/test/java/io/swagger/v3/jaxrs2/ReaderTest.java b/modules/swagger-jaxrs2/src/test/java/io/swagger/v3/jaxrs2/ReaderTest.java index c7e9de8e3a..223cfaf73b 100644 --- a/modules/swagger-jaxrs2/src/test/java/io/swagger/v3/jaxrs2/ReaderTest.java +++ b/modules/swagger-jaxrs2/src/test/java/io/swagger/v3/jaxrs2/ReaderTest.java @@ -1,6 +1,6 @@ package io.swagger.v3.jaxrs2; -import com.fasterxml.jackson.databind.ObjectMapper; +import tools.jackson.databind.ObjectMapper; import io.swagger.v3.core.converter.AnnotatedType; import io.swagger.v3.core.converter.ModelConverter; diff --git a/modules/swagger-jaxrs2/src/test/java/io/swagger/v3/jaxrs2/annotations/AbstractAnnotationTest.java b/modules/swagger-jaxrs2/src/test/java/io/swagger/v3/jaxrs2/annotations/AbstractAnnotationTest.java index 1ea6863dc3..09a36a574e 100644 --- a/modules/swagger-jaxrs2/src/test/java/io/swagger/v3/jaxrs2/annotations/AbstractAnnotationTest.java +++ b/modules/swagger-jaxrs2/src/test/java/io/swagger/v3/jaxrs2/annotations/AbstractAnnotationTest.java @@ -1,7 +1,7 @@ package io.swagger.v3.jaxrs2.annotations; import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.databind.JsonNode; +import tools.jackson.databind.JsonNode; import io.swagger.v3.core.util.Yaml; import io.swagger.v3.jaxrs2.Reader; import io.swagger.v3.jaxrs2.matchers.SerializationMatchers; @@ -10,10 +10,14 @@ import org.apache.commons.io.IOUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import tools.jackson.databind.ObjectMapper; +import tools.jackson.databind.cfg.MapperBuilder; +import tools.jackson.dataformat.yaml.YAMLFactoryBuilder; import java.io.IOException; import java.io.InputStream; import java.nio.charset.StandardCharsets; +import java.util.function.Consumer; import static org.testng.Assert.fail; @@ -25,11 +29,13 @@ public String readIntoYaml(final Class cls) { OpenAPI openAPI = reader.read(cls); try { - Yaml.mapper().setSerializationInclusion(JsonInclude.Include.NON_NULL); + ObjectMapper mapper = Yaml.mapper(mapperBuilder -> mapperBuilder.changeDefaultPropertyInclusion(incl -> incl + .withContentInclusion(JsonInclude.Include.NON_NULL) + .withValueInclusion(JsonInclude.Include.NON_NULL))); // parse JSON - JsonNode jsonNodeTree = Yaml.mapper().readTree(Yaml.mapper().writeValueAsString(openAPI)); + JsonNode jsonNodeTree = mapper.readTree(mapper.writeValueAsString(openAPI)); // return it as YAML - return Yaml.mapper().writeValueAsString(jsonNodeTree); + return mapper.writeValueAsString(jsonNodeTree); } catch (Exception e) { return "Empty YAML"; } diff --git a/modules/swagger-jaxrs2/src/test/java/io/swagger/v3/jaxrs2/integration/SortedOutputTest.java b/modules/swagger-jaxrs2/src/test/java/io/swagger/v3/jaxrs2/integration/SortedOutputTest.java index 8c3a9a7071..87fd9ac279 100644 --- a/modules/swagger-jaxrs2/src/test/java/io/swagger/v3/jaxrs2/integration/SortedOutputTest.java +++ b/modules/swagger-jaxrs2/src/test/java/io/swagger/v3/jaxrs2/integration/SortedOutputTest.java @@ -5,11 +5,10 @@ import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonPropertyOrder; -import com.fasterxml.jackson.core.util.DefaultPrettyPrinter; -import com.fasterxml.jackson.databind.MapperFeature; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.SerializationFeature; -import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import tools.jackson.databind.MapperFeature; +import tools.jackson.databind.ObjectMapper; +import tools.jackson.databind.SerializationFeature; +import tools.jackson.databind.annotation.JsonSerialize; import io.swagger.v3.core.jackson.PathsSerializer; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; @@ -71,7 +70,7 @@ public void sortOutputTest() throws Exception { .init(); OpenAPI openApi = ctx.read(); - String sorted = ctx.getOutputYamlMapper().writer(new DefaultPrettyPrinter()).writeValueAsString(openApi); + String sorted = ctx.getOutputYamlMapper().writerWithDefaultPrettyPrinter().writeValueAsString(openApi); openApiConfiguration = new SwaggerConfiguration() .resourcePackages(Collections.singleton("com.my.sorted.resources")); @@ -80,7 +79,7 @@ public void sortOutputTest() throws Exception { .openApiConfiguration(openApiConfiguration) .init(); - String notSorted = ctx.getOutputYamlMapper().writer(new DefaultPrettyPrinter()).writeValueAsString(openApi); + String notSorted = ctx.getOutputYamlMapper().writerWithDefaultPrettyPrinter().writeValueAsString(openApi); assertEquals(sorted, expectedSorted); assertEquals(notSorted, expectedNotSorted); @@ -149,19 +148,23 @@ public static abstract class SortedSchemaMixin { public static class SortedProcessor implements ObjectMapperProcessor { @Override - public void processOutputJsonObjectMapper(ObjectMapper mapper) { - mapper.configure(SerializationFeature.ORDER_MAP_ENTRIES_BY_KEYS, true); - mapper.configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY, true); - mapper.addMixIn(OpenAPI.class, SortedOpenAPIMixin.class); - mapper.addMixIn(Schema.class, SortedSchemaMixin.class); + public ObjectMapper processOutputJsonObjectMapper(ObjectMapper mapper) { + return mapper.rebuild() + .configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY, true) + .configure(SerializationFeature.ORDER_MAP_ENTRIES_BY_KEYS, true) + .addMixIn(OpenAPI.class, SortedOpenAPIMixin.class) + .addMixIn(Schema.class, SortedSchemaMixin.class) + .build(); } @Override - public void processOutputYamlObjectMapper(ObjectMapper mapper) { - mapper.configure(SerializationFeature.ORDER_MAP_ENTRIES_BY_KEYS, true); - mapper.configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY, true); - mapper.addMixIn(OpenAPI.class, SortedOpenAPIMixin.class); - mapper.addMixIn(Schema.class, SortedSchemaMixin.class); + public ObjectMapper processOutputYamlObjectMapper(ObjectMapper mapper) { + return mapper.rebuild() + .configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY, true) + .configure(SerializationFeature.ORDER_MAP_ENTRIES_BY_KEYS, true) + .addMixIn(OpenAPI.class, SortedOpenAPIMixin.class) + .addMixIn(Schema.class, SortedSchemaMixin.class) + .build(); } } @@ -176,7 +179,7 @@ public void configOutputTest() throws Exception { .init(); OpenAPI openApi = ctx.read(); - String sorted = ctx.getOutputYamlMapper().writer(new DefaultPrettyPrinter()).writeValueAsString(openApi); + String sorted = ctx.getOutputYamlMapper().writerWithDefaultPrettyPrinter().writeValueAsString(openApi); openApiConfiguration = new SwaggerConfiguration() .resourcePackages(Collections.singleton("com.my.sorted.resources")); @@ -185,7 +188,7 @@ public void configOutputTest() throws Exception { .openApiConfiguration(openApiConfiguration) .init(); - String notSorted = ctx.getOutputYamlMapper().writer(new DefaultPrettyPrinter()).writeValueAsString(openApi); + String notSorted = ctx.getOutputYamlMapper().writerWithDefaultPrettyPrinter().writeValueAsString(openApi); assertEquals(sorted, expectedSorted); assertEquals(notSorted, expectedNotSorted); diff --git a/modules/swagger-jaxrs2/src/test/java/io/swagger/v3/jaxrs2/it/OpenApiResourceIT.java b/modules/swagger-jaxrs2/src/test/java/io/swagger/v3/jaxrs2/it/OpenApiResourceIT.java index 8d8b2fabee..1ef80b9b18 100644 --- a/modules/swagger-jaxrs2/src/test/java/io/swagger/v3/jaxrs2/it/OpenApiResourceIT.java +++ b/modules/swagger-jaxrs2/src/test/java/io/swagger/v3/jaxrs2/it/OpenApiResourceIT.java @@ -1,6 +1,7 @@ package io.swagger.v3.jaxrs2.it; -import com.fasterxml.jackson.databind.SerializationFeature; +import tools.jackson.databind.ObjectMapper; +import tools.jackson.databind.SerializationFeature; import io.restassured.http.ContentType; import io.swagger.v3.core.util.Json; @@ -700,14 +701,18 @@ public void testYamlOpenAPI31WithBootstrapServlet() throws Exception { } private String formatYaml(String source) throws IOException { - return Yaml.mapper().configure(SerializationFeature.ORDER_MAP_ENTRIES_BY_KEYS, true) + ObjectMapper mapper = Yaml.mapper(mapperBuilder -> + mapperBuilder.configure(SerializationFeature.ORDER_MAP_ENTRIES_BY_KEYS, true)); + return mapper .writerWithDefaultPrettyPrinter() - .writeValueAsString(Yaml.mapper().readValue(source, Object.class)); + .writeValueAsString(mapper.readValue(source, Object.class)); } private String formatJson(String source) throws IOException { - return Json.mapper().configure(SerializationFeature.ORDER_MAP_ENTRIES_BY_KEYS, true) + ObjectMapper mapper = Json.mapper(mapperBuilder -> + mapperBuilder.configure(SerializationFeature.ORDER_MAP_ENTRIES_BY_KEYS, true)); + return mapper .writerWithDefaultPrettyPrinter() - .writeValueAsString(Json.mapper().readValue(source, Object.class)); + .writeValueAsString(mapper.readValue(source, Object.class)); } } diff --git a/modules/swagger-jaxrs2/src/test/java/io/swagger/v3/jaxrs2/matchers/SerializationMatchers.java b/modules/swagger-jaxrs2/src/test/java/io/swagger/v3/jaxrs2/matchers/SerializationMatchers.java index d66f3a0706..11bf91fd49 100644 --- a/modules/swagger-jaxrs2/src/test/java/io/swagger/v3/jaxrs2/matchers/SerializationMatchers.java +++ b/modules/swagger-jaxrs2/src/test/java/io/swagger/v3/jaxrs2/matchers/SerializationMatchers.java @@ -1,9 +1,10 @@ package io.swagger.v3.jaxrs2.matchers; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.node.NumericNode; -import com.fasterxml.jackson.databind.node.ObjectNode; +import tools.jackson.core.JacksonException; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.ObjectMapper; +import tools.jackson.databind.node.NumericNode; +import tools.jackson.databind.node.ObjectNode; import io.swagger.v3.core.util.Json; import io.swagger.v3.core.util.Json31; @@ -44,7 +45,7 @@ private static void apply(Object objectToSerialize, String str, ObjectMapper map ObjectNode rhs = null; try { rhs = mapper.readValue(str, ObjectNode.class); - } catch (IOException e) { + } catch (JacksonException e) { LOGGER.error("Failed to read value", e); } if (exactMatch || !lhs.equals(new ObjectNodeComparator(), rhs)) { @@ -58,7 +59,7 @@ private static void apply31(Object objectToSerialize, String str, ObjectMapper m ObjectNode rhs = null; try { rhs = mapper.readValue(str, ObjectNode.class); - } catch (IOException e) { + } catch (JacksonException e) { LOGGER.error("Failed to read value", e); } if (!lhs.equals(new ObjectNodeComparator(), rhs)) { @@ -77,7 +78,7 @@ public int compare(JsonNode o1, JsonNode o2) { double d2 = ((NumericNode) o2).asDouble(); return Double.compare(d1, d2); } - int comp = o1.asText().compareTo(o2.asText()); + int comp = o1.asString().compareTo(o2.asString()); if (comp == 0) { return Integer.compare(o1.hashCode(), o2.hashCode()); } diff --git a/modules/swagger-maven-plugin/src/main/java/io/swagger/v3/plugin/maven/SwaggerMojo.java b/modules/swagger-maven-plugin/src/main/java/io/swagger/v3/plugin/maven/SwaggerMojo.java index 6bb3e37a34..1a6ac81e25 100644 --- a/modules/swagger-maven-plugin/src/main/java/io/swagger/v3/plugin/maven/SwaggerMojo.java +++ b/modules/swagger-maven-plugin/src/main/java/io/swagger/v3/plugin/maven/SwaggerMojo.java @@ -1,6 +1,5 @@ package io.swagger.v3.plugin.maven; -import com.fasterxml.jackson.core.util.DefaultPrettyPrinter; import io.swagger.v3.core.filter.OpenAPISpecFilter; import io.swagger.v3.core.filter.SpecFilter; import io.swagger.v3.core.util.Configuration; @@ -23,6 +22,7 @@ import org.apache.maven.project.MavenProject; import org.codehaus.plexus.util.FileUtils; import org.codehaus.plexus.util.StringUtils; +import tools.jackson.core.JacksonException; import java.io.File; import java.io.IOException; @@ -101,14 +101,14 @@ public void execute() throws MojoExecutionException, MojoFailureException { String openapiYaml = null; if (Format.JSON.equals(outputFormat) || Format.JSONANDYAML.equals(outputFormat)) { if (config.isPrettyPrint() != null && config.isPrettyPrint()) { - openapiJson = context.getOutputJsonMapper().writer(new DefaultPrettyPrinter()).writeValueAsString(openAPI); + openapiJson = context.getOutputJsonMapper().writerWithDefaultPrettyPrinter().writeValueAsString(openAPI); } else { openapiJson = context.getOutputJsonMapper().writeValueAsString(openAPI); } } if (Format.YAML.equals(outputFormat) || Format.JSONANDYAML.equals(outputFormat)) { if (config.isPrettyPrint() != null && config.isPrettyPrint()) { - openapiYaml = context.getOutputYamlMapper().writer(new DefaultPrettyPrinter()).writeValueAsString(openAPI); + openapiYaml = context.getOutputYamlMapper().writerWithDefaultPrettyPrinter().writeValueAsString(openAPI); } else { openapiYaml = context.getOutputYamlMapper().writeValueAsString(openAPI); } @@ -288,14 +288,14 @@ private List, T>> getSortedMappers(Path pathObj) list.add((content, typeClass) -> { try { return Json.mapper().readValue(content, typeClass); - } catch (IOException e) { + } catch (JacksonException e) { throw new IllegalStateException(e); } }); list.add((content, typeClass) -> { try { return Yaml.mapper().readValue(content, typeClass); - } catch (IOException e) { + } catch (JacksonException e) { throw new IllegalStateException(e); } }); diff --git a/modules/swagger-models/pom.xml b/modules/swagger-models/pom.xml index 558bb1e7e5..e4a66c4f28 100644 --- a/modules/swagger-models/pom.xml +++ b/modules/swagger-models/pom.xml @@ -48,14 +48,16 @@ - com.fasterxml.jackson.core + tools.jackson.core jackson-core test + 3.0.3 - com.fasterxml.jackson.core + tools.jackson.core jackson-databind test + 3.0.3 org.testng diff --git a/modules/swagger-models/src/test/java/io/swagger/test/SimpleBuilderTest.java b/modules/swagger-models/src/test/java/io/swagger/test/SimpleBuilderTest.java index 2368f792c3..fdf040d3b6 100644 --- a/modules/swagger-models/src/test/java/io/swagger/test/SimpleBuilderTest.java +++ b/modules/swagger-models/src/test/java/io/swagger/test/SimpleBuilderTest.java @@ -1,10 +1,8 @@ package io.swagger.test; import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.core.util.DefaultPrettyPrinter; -import com.fasterxml.jackson.databind.DeserializationFeature; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.SerializationFeature; +import tools.jackson.core.util.DefaultPrettyPrinter; +import tools.jackson.databind.ObjectMapper; import io.swagger.v3.oas.models.Components; import io.swagger.v3.oas.models.ExternalDocumentation; import io.swagger.v3.oas.models.OpenAPI; @@ -26,6 +24,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.testng.annotations.Test; +import tools.jackson.databind.json.JsonMapper; import java.math.BigDecimal; import java.util.ArrayList; @@ -127,13 +126,12 @@ public void testBuilder() throws Exception { } public static String writeJson(Object value) throws Exception { - ObjectMapper mapper = new ObjectMapper(); + ObjectMapper mapper = JsonMapper.builder() + .changeDefaultPropertyInclusion(incl -> incl + .withContentInclusion(JsonInclude.Include.NON_NULL) + .withValueInclusion(JsonInclude.Include.NON_NULL)) + .build(); - mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); - mapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false); - mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false); - mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); - - return mapper.writer(new DefaultPrettyPrinter()).writeValueAsString(value); + return mapper.writerWithDefaultPrettyPrinter().writeValueAsString(value); } } diff --git a/modules/swagger-project-jakarta/modules/swagger-core-jakarta/pom.xml b/modules/swagger-project-jakarta/modules/swagger-core-jakarta/pom.xml index 0d9f0af6a9..a169a6bb8c 100644 --- a/modules/swagger-project-jakarta/modules/swagger-core-jakarta/pom.xml +++ b/modules/swagger-project-jakarta/modules/swagger-core-jakarta/pom.xml @@ -127,16 +127,14 @@ jackson-annotations - com.fasterxml.jackson.core + tools.jackson.core jackson-databind + 3.0.3 - com.fasterxml.jackson.dataformat + tools.jackson.dataformat jackson-dataformat-yaml - - - com.fasterxml.jackson.datatype - jackson-datatype-jsr310 + 3.0.3 diff --git a/modules/swagger-project-jakarta/modules/swagger-jaxrs2-jakarta/pom.xml b/modules/swagger-project-jakarta/modules/swagger-jaxrs2-jakarta/pom.xml index ba4fb41be2..7254515a96 100644 --- a/modules/swagger-project-jakarta/modules/swagger-jaxrs2-jakarta/pom.xml +++ b/modules/swagger-project-jakarta/modules/swagger-jaxrs2-jakarta/pom.xml @@ -129,11 +129,12 @@ - com.fasterxml.jackson.core + tools.jackson.core jackson-databind + 3.0.3 - com.fasterxml.jackson.jakarta.rs + tools.jackson.jakarta.rs jackson-jakarta-rs-json-provider ${jackson-version} diff --git a/modules/swagger-project-jakarta/modules/swagger-maven-plugin-jakarta/src/main/java/io/swagger/v3/plugin/maven/jakarta/JakartaTransformer.java b/modules/swagger-project-jakarta/modules/swagger-maven-plugin-jakarta/src/main/java/io/swagger/v3/plugin/maven/jakarta/JakartaTransformer.java index a95022306f..1a6b97b712 100644 --- a/modules/swagger-project-jakarta/modules/swagger-maven-plugin-jakarta/src/main/java/io/swagger/v3/plugin/maven/jakarta/JakartaTransformer.java +++ b/modules/swagger-project-jakarta/modules/swagger-maven-plugin-jakarta/src/main/java/io/swagger/v3/plugin/maven/jakarta/JakartaTransformer.java @@ -78,7 +78,7 @@ public class JakartaTransformer { private static final String jakartaValidationRegex = "^.*(.*jakarta\\.validation((?!).)*).*$"; private static final String jacksonJsonDep = "\n" + - " com.fasterxml.jackson.jakarta.rs\n" + + " tools.jackson.jakarta.rs\n" + " jackson-jakarta-rs-json-provider\n" + " VERSION\n" + " \n" + @@ -96,7 +96,7 @@ public class JakartaTransformer { private static final String jacksonJsonRegex = "^.*(.*jackson\\-jaxrs\\-json((?!).)*).*$"; private static final String jacksonBaseDep = "\n" + - " com.fasterxml.jackson.jakarta.rs\n" + + " tools.jackson.jakarta.rs\n" + " jackson-jakarta-rs-base\n" + " VERSION\n" + " "; @@ -104,7 +104,7 @@ public class JakartaTransformer { private static final String jacksonBaseRegex = "^.*(.*jackson\\-jaxrs\\-base((?!).)*).*$"; private static final String jacksonJaxbDep = "\n" + - " com.fasterxml.jackson.module\n" + + " tools.jackson.module\n" + " jackson-module-jakarta-xmlbind-annotations\n" + " VERSION\n" + " \n" + diff --git a/modules/swagger-project-jakarta/pom.xml b/modules/swagger-project-jakarta/pom.xml index f438681ad9..e9f274d638 100644 --- a/modules/swagger-project-jakarta/pom.xml +++ b/modules/swagger-project-jakarta/pom.xml @@ -58,7 +58,7 @@ maven-compiler-plugin - 3.11.0 + 3.14.1 org.apache.maven.plugins @@ -234,15 +234,15 @@ org.apache.maven.plugins maven-javadoc-plugin - 3.6.2 + ${maven-javadoc-plugin-version} true - 1.8 + 17 UTF-8 1g true - https://docs.oracle.com/javase/8/docs/api + https://docs.oracle.com/en/java/javase/17/docs/api @@ -379,17 +379,17 @@ com.fasterxml.jackson.core jackson-annotations - ${jackson-version} + ${jackson-annotations-version} - com.fasterxml.jackson.core + tools.jackson.core jackson-core ${jackson-version} - com.fasterxml.jackson.core + tools.jackson.core jackson-databind - ${jackson-databind-version} + ${jackson-version} jakarta.activation @@ -402,17 +402,12 @@ - com.fasterxml.jackson.dataformat + tools.jackson.dataformat jackson-dataformat-yaml ${jackson-version} - com.fasterxml.jackson.datatype - jackson-datatype-jsr310 - ${jackson-version} - - - com.fasterxml.jackson.jakarta.rs + tools.jackson.jakarta.rs jackson-jakarta-rs-json-provider ${jackson-version} @@ -427,12 +422,12 @@ - com.fasterxml.jackson.jakarta.rs + tools.jackson.jakarta.rs jackson-jakarta-rs-base ${jackson-version} - com.fasterxml.jackson.module + tools.jackson.module jackson-module-jakarta-xmlbind-annotations ${jackson-version} @@ -460,7 +455,7 @@ - 8 + 17 2.2.4 2.13.0 2.3 @@ -471,8 +466,8 @@ 6.4.0 5.0.0 3.1.10 - 2.19.2 - 2.19.2 + 2.20 + 3.0.3 1.5.22 4.8.184 32.1.3-jre @@ -490,6 +485,7 @@ 2.22.2 3.2.1 2.22.2 + 3.12.0 0.90 0.90 diff --git a/pom.xml b/pom.xml index 73b4bca6d9..5ef92e6a6e 100644 --- a/pom.xml +++ b/pom.xml @@ -94,7 +94,7 @@ maven-compiler-plugin - 3.11.0 + 3.14.1 org.apache.maven.plugins @@ -153,14 +153,14 @@ org.apache.maven.plugins maven-javadoc-plugin - 3.6.2 + ${maven-javadoc-plugin-version} true - 1.8 + 17 UTF-8 1g - http://docs.oracle.com/javase/8/docs/api + https://docs.oracle.com/en/java/javase/17/docs/api ${javadoc.package.exclude} @@ -326,7 +326,7 @@ org.jacoco jacoco-maven-plugin - 0.8.6 + 0.8.14 @@ -412,15 +412,15 @@ org.apache.maven.plugins maven-javadoc-plugin - 3.6.2 + ${maven-javadoc-plugin-version} true - 1.8 + 17 UTF-8 1g true - https://docs.oracle.com/javase/8/docs/api + https://docs.oracle.com/en/java/javase/17/docs/api @@ -535,28 +535,23 @@ ${classgraph-version} - com.fasterxml.jackson.dataformat + tools.jackson.dataformat jackson-dataformat-yaml ${jackson-version} com.fasterxml.jackson.core jackson-annotations - ${jackson-version} + ${jackson-annotations-version} - com.fasterxml.jackson.core + tools.jackson.core jackson-databind - ${jackson-databind-version} - - - com.fasterxml.jackson.core - jackson-core ${jackson-version} - com.fasterxml.jackson.datatype - jackson-datatype-jsr310 + tools.jackson.core + jackson-core ${jackson-version} @@ -618,7 +613,7 @@ - 8 + 17 2.2.4 2.13.0 2.3 @@ -628,8 +623,8 @@ 6.4.0 4.0.4 2.46 - 2.19.2 - 2.19.2 + 2.20 + 3.0.3 1.5.22 4.8.184 32.1.3-jre @@ -647,6 +642,7 @@ 3.5.0 3.2.1 2.22.2 + 3.12.0 0.90 0.90