Skip to content

Commit f60ee1e

Browse files
committed
feat: migrate to jackson 3
1 parent cea807b commit f60ee1e

File tree

114 files changed

+898
-823
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

114 files changed

+898
-823
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,7 @@ You need the following installed and available in your $PATH:
131131

132132
* Java 17
133133
* Apache maven 3.0.4 or greater
134-
* Jackson 2.4.5 or greater
134+
* Jackson 3.0.3 or greater
135135

136136

137137
### To build from source (currently 2.2.42-SNAPSHOT)

modules/swagger-core/pom.xml

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -69,16 +69,14 @@
6969
<artifactId>jackson-annotations</artifactId>
7070
</dependency>
7171
<dependency>
72-
<groupId>com.fasterxml.jackson.core</groupId>
72+
<groupId>tools.jackson.core</groupId>
7373
<artifactId>jackson-databind</artifactId>
74+
<version>3.0.3</version>
7475
</dependency>
7576
<dependency>
76-
<groupId>com.fasterxml.jackson.dataformat</groupId>
77+
<groupId>tools.jackson.dataformat</groupId>
7778
<artifactId>jackson-dataformat-yaml</artifactId>
78-
</dependency>
79-
<dependency>
80-
<groupId>com.fasterxml.jackson.datatype</groupId>
81-
<artifactId>jackson-datatype-jsr310</artifactId>
79+
<version>3.0.3</version>
8280
</dependency>
8381
<dependency>
8482
<groupId>io.swagger.core.v3</groupId>

modules/swagger-core/src/main/java/io/swagger/v3/core/converter/ModelConverters.java

Lines changed: 30 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
package io.swagger.v3.core.converter;
22

3-
import com.fasterxml.jackson.databind.type.TypeFactory;
3+
import tools.jackson.databind.ObjectMapper;
4+
import tools.jackson.databind.cfg.MapperBuilder;
5+
import tools.jackson.databind.json.JsonMapper;
6+
import tools.jackson.databind.type.TypeFactory;
47
import io.swagger.v3.core.jackson.ModelResolver;
58
import io.swagger.v3.core.util.Configuration;
69
import io.swagger.v3.core.util.Json;
@@ -20,6 +23,7 @@
2023
import java.util.ServiceLoader;
2124
import java.util.Set;
2225
import java.util.concurrent.CopyOnWriteArrayList;
26+
import java.util.function.Consumer;
2327

2428
public class ModelConverters {
2529
private static ModelConverters SINGLETON = null;
@@ -30,8 +34,7 @@ public class ModelConverters {
3034
private final Set<String> skippedClasses = new HashSet<>();
3135

3236
public ModelConverters() {
33-
converters = new CopyOnWriteArrayList<>();
34-
converters.add(new ModelResolver(Json.mapper()));
37+
this(false);
3538
}
3639

3740
public ModelConverters(boolean openapi31) {
@@ -52,6 +55,15 @@ public ModelConverters(boolean openapi31, Schema.SchemaResolution schemaResoluti
5255
}
5356
}
5457

58+
public ModelConverters(boolean openapi31, Consumer<MapperBuilder<? extends ObjectMapper, ? extends MapperBuilder<?, ?>>> mapperBuilderCustomizer) {
59+
converters = new CopyOnWriteArrayList<>();
60+
if (openapi31) {
61+
converters.add(new ModelResolver(Json31.mapper(mapperBuilderCustomizer)).openapi31(true));
62+
} else {
63+
converters.add(new ModelResolver(Json.mapper(mapperBuilderCustomizer)));
64+
}
65+
}
66+
5567
public ModelConverters(Configuration configuration) {
5668
converters = new CopyOnWriteArrayList<>();
5769
boolean openapi31 =configuration != null && configuration.isOpenAPI31() != null && configuration.isOpenAPI31();
@@ -67,20 +79,32 @@ public Set<String> getSkippedPackages() {
6779
}
6880

6981
public static ModelConverters getInstance(boolean openapi31) {
82+
return getInstance(openapi31, mapperBuilder -> {});
83+
}
84+
85+
public static ModelConverters getInstance(boolean openapi31, Consumer<MapperBuilder<? extends ObjectMapper, ? extends MapperBuilder<?, ?>>> mapperBuilderCustomizer) {
7086
if (openapi31) {
7187
if (SINGLETON31 == null) {
72-
SINGLETON31 = new ModelConverters(openapi31);
88+
SINGLETON31 = new ModelConverters(openapi31, mapperBuilderCustomizer);
7389
init(SINGLETON31);
7490
}
7591
return SINGLETON31;
7692
}
7793
if (SINGLETON == null) {
78-
SINGLETON = new ModelConverters(openapi31);
94+
SINGLETON = new ModelConverters(openapi31, mapperBuilderCustomizer);
7995
init(SINGLETON);
8096
}
8197
return SINGLETON;
8298
}
8399

100+
public static ModelConverters getInstance() {
101+
return getInstance(false);
102+
}
103+
104+
public static ModelConverters getInstance(Consumer<MapperBuilder<? extends ObjectMapper, ? extends MapperBuilder<?, ?>>> mapperBuilderCustomizer) {
105+
return getInstance(false, mapperBuilderCustomizer);
106+
}
107+
84108
public static void reset() {
85109
synchronized (ModelConverters.class) {
86110
SINGLETON = null;
@@ -145,10 +169,6 @@ private static void init(ModelConverters converter) {
145169
}
146170

147171
}
148-
public static ModelConverters getInstance() {
149-
return getInstance(false);
150-
}
151-
152172

153173
public void addConverter(ModelConverter converter) {
154174
converters.add(0, converter);
@@ -233,7 +253,7 @@ public boolean isRegisteredAsSkippedClass(String className) {
233253
}
234254

235255
private boolean shouldProcess(Type type) {
236-
final Class<?> cls = TypeFactory.defaultInstance().constructType(type).getRawClass();
256+
final Class<?> cls = TypeFactory.createDefaultInstance().constructType(type).getRawClass();
237257
if (cls.isPrimitive()) {
238258
return false;
239259
}

modules/swagger-core/src/main/java/io/swagger/v3/core/filter/SpecFilter.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import io.swagger.v3.oas.models.responses.ApiResponses;
2222
import io.swagger.v3.oas.models.tags.Tag;
2323
import org.apache.commons.lang3.StringUtils;
24+
import tools.jackson.core.JacksonException;
2425

2526
import java.io.IOException;
2627
import java.util.ArrayList;
@@ -290,7 +291,7 @@ protected Map<String, Schema> filterComponentsSchema(OpenAPISpecFilter filter, M
290291
}
291292
clonedComponentsSchema.put(key, clonedModel);
292293

293-
} catch (IOException e) {
294+
} catch (JacksonException e) {
294295
}
295296
}
296297
}

modules/swagger-core/src/main/java/io/swagger/v3/core/jackson/AbstractModelConverter.java

Lines changed: 21 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,17 @@
11
package io.swagger.v3.core.jackson;
22

3-
import com.fasterxml.jackson.core.Version;
4-
import com.fasterxml.jackson.databind.AnnotationIntrospector;
5-
import com.fasterxml.jackson.databind.BeanDescription;
6-
import com.fasterxml.jackson.databind.JavaType;
7-
import com.fasterxml.jackson.databind.ObjectMapper;
8-
import com.fasterxml.jackson.databind.PropertyName;
9-
import com.fasterxml.jackson.databind.jsontype.NamedType;
10-
import com.fasterxml.jackson.databind.module.SimpleModule;
3+
import tools.jackson.core.Version;
4+
import tools.jackson.databind.AnnotationIntrospector;
5+
import tools.jackson.databind.BeanDescription;
6+
import tools.jackson.databind.JavaType;
7+
import tools.jackson.databind.ObjectMapper;
8+
import tools.jackson.databind.PropertyName;
9+
import tools.jackson.databind.cfg.MapperBuilder;
10+
import tools.jackson.databind.introspect.AccessorNamingStrategy;
11+
import tools.jackson.databind.introspect.BasicBeanDescription;
12+
import tools.jackson.databind.introspect.DefaultAccessorNamingStrategy;
13+
import tools.jackson.databind.jsontype.NamedType;
14+
import tools.jackson.databind.module.SimpleModule;
1115
import io.swagger.v3.core.converter.AnnotatedType;
1216
import io.swagger.v3.core.converter.ModelConverter;
1317
import io.swagger.v3.core.converter.ModelConverterContext;
@@ -33,14 +37,16 @@ protected AbstractModelConverter(ObjectMapper mapper) {
3337
}
3438

3539
protected AbstractModelConverter(ObjectMapper mapper, TypeNameResolver typeNameResolver) {
36-
mapper.registerModule(
37-
new SimpleModule("swagger", Version.unknownVersion()) {
40+
_mapper = mapper.rebuild()
41+
.addModule(new SimpleModule("swagger", Version.unknownVersion()) {
3842
@Override
3943
public void setupModule(SetupContext context) {
4044
context.insertAnnotationIntrospector(new SwaggerAnnotationIntrospector());
4145
}
42-
});
43-
_mapper = mapper;
46+
})
47+
.accessorNaming(new DefaultAccessorNamingStrategy.Provider()
48+
.withFirstCharAcceptance(true, true))
49+
.build();
4450
_typeNameResolver = typeNameResolver;
4551
}
4652

@@ -61,7 +67,7 @@ public Schema resolve(AnnotatedType type, ModelConverterContext context, Iterato
6167
* @return the current AnnotationIntrospector
6268
*/
6369
protected AnnotationIntrospector _intr() {
64-
return _mapper.getSerializationConfig().getAnnotationIntrospector();
70+
return _mapper.serializationConfig().getAnnotationIntrospector();
6571
}
6672

6773
protected String _typeName(JavaType type) {
@@ -95,10 +101,10 @@ protected String _findTypeName(JavaType type, BeanDescription beanDesc) {
95101
return "List";
96102
}
97103
if (beanDesc == null) {
98-
beanDesc = _mapper.getSerializationConfig().introspectClassAnnotations(type);
104+
beanDesc = _mapper._serializationContext().introspectBeanDescription(type);
99105
}
100106

101-
PropertyName rootName = _intr().findRootName(beanDesc.getClassInfo());
107+
PropertyName rootName = _intr().findRootName(_mapper.serializationConfig(), beanDesc.getClassInfo());
102108
if (rootName != null && rootName.hasSimpleName()) {
103109
return rootName.getSimpleName();
104110
}
Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,36 +1,37 @@
11
package io.swagger.v3.core.jackson;
22

3-
import com.fasterxml.jackson.core.JsonGenerator;
4-
import com.fasterxml.jackson.databind.JsonSerializer;
5-
import com.fasterxml.jackson.databind.SerializerProvider;
3+
import tools.jackson.core.JacksonException;
4+
import tools.jackson.core.JsonGenerator;
65

76
import io.swagger.v3.oas.models.responses.ApiResponses;
7+
import tools.jackson.databind.SerializationContext;
8+
import tools.jackson.databind.ValueSerializer;
89

910
import java.io.IOException;
1011
import java.util.Map;
1112
import java.util.Map.Entry;
1213

13-
public class ApiResponsesSerializer extends JsonSerializer<ApiResponses> {
14+
public class ApiResponsesSerializer extends ValueSerializer<ApiResponses> {
1415

1516
@Override
1617
public void serialize(
17-
ApiResponses value, JsonGenerator jgen, SerializerProvider provider)
18-
throws IOException {
18+
ApiResponses value, JsonGenerator jgen, SerializationContext provider)
19+
throws JacksonException {
1920

2021
if (value != null && value.getExtensions() != null && !value.getExtensions().isEmpty()) {
2122
jgen.writeStartObject();
2223

2324
if (!value.isEmpty()) {
2425
for (Entry<String, io.swagger.v3.oas.models.responses.ApiResponse> entry: value.entrySet()) {
25-
jgen.writeObjectField(entry.getKey() , entry.getValue());
26+
jgen.writePOJOProperty(entry.getKey() , entry.getValue());
2627
}
2728
}
2829
for (Map.Entry<String, Object> entry: value.getExtensions().entrySet()) {
29-
jgen.writeObjectField(entry.getKey(), entry.getValue());
30+
jgen.writePOJOProperty(entry.getKey(), entry.getValue());
3031
}
3132
jgen.writeEndObject();
3233
} else {
33-
provider.defaultSerializeValue(value, jgen);
34+
jgen.writePOJO(value);
3435
}
3536
}
3637
}

modules/swagger-core/src/main/java/io/swagger/v3/core/jackson/CallbackSerializer.java

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,23 @@
11
package io.swagger.v3.core.jackson;
22

3-
import com.fasterxml.jackson.core.JsonGenerator;
4-
import com.fasterxml.jackson.databind.JsonSerializer;
5-
import com.fasterxml.jackson.databind.SerializerProvider;
3+
import tools.jackson.core.JacksonException;
4+
import tools.jackson.core.JsonGenerator;
65

76
import io.swagger.v3.oas.models.PathItem;
87
import io.swagger.v3.oas.models.callbacks.Callback;
98
import org.apache.commons.lang3.StringUtils;
9+
import tools.jackson.databind.SerializationContext;
10+
import tools.jackson.databind.ValueSerializer;
1011

1112
import java.io.IOException;
1213
import java.util.Map.Entry;
1314

14-
public class CallbackSerializer extends JsonSerializer<Callback> {
15+
public class CallbackSerializer extends ValueSerializer<Callback> {
1516

1617
@Override
1718
public void serialize(
18-
Callback value, JsonGenerator jgen, SerializerProvider provider)
19-
throws IOException {
19+
Callback value, JsonGenerator jgen, SerializationContext provider)
20+
throws JacksonException {
2021

2122
// has extensions
2223
if (value != null && value.getExtensions() != null && !value.getExtensions().isEmpty()) {
@@ -27,22 +28,22 @@ public void serialize(
2728
if (!value.isEmpty()) {
2829
// write map
2930
for (Entry<String, PathItem> entry: value.entrySet()) {
30-
jgen.writeObjectField(entry.getKey() , entry.getValue());
31+
jgen.writePOJOProperty(entry.getKey() , entry.getValue());
3132
}
3233
}
3334
} else { // handle ref schema serialization skipping all other props ...
34-
jgen.writeStringField("$ref", value.get$ref());
35+
jgen.writeStringProperty("$ref", value.get$ref());
3536
}
3637
for (String ext: value.getExtensions().keySet()) {
37-
jgen.writeObjectField(ext , value.getExtensions().get(ext));
38+
jgen.writePOJOProperty(ext , value.getExtensions().get(ext));
3839
}
3940
jgen.writeEndObject();
4041
} else {
4142
if (value == null || StringUtils.isBlank(value.get$ref())) {
42-
provider.defaultSerializeValue(value, jgen);
43+
jgen.writePOJO(value);
4344
} else { // handle ref schema serialization skipping all other props
4445
jgen.writeStartObject();
45-
jgen.writeStringField("$ref", value.get$ref());
46+
jgen.writeStringProperty("$ref", value.get$ref());
4647
jgen.writeEndObject();
4748
}
4849
}

modules/swagger-core/src/main/java/io/swagger/v3/core/jackson/ExampleSerializer.java

Lines changed: 13 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,38 +1,34 @@
11
package io.swagger.v3.core.jackson;
22

3-
import com.fasterxml.jackson.core.JsonGenerator;
4-
import com.fasterxml.jackson.databind.JsonMappingException;
5-
import com.fasterxml.jackson.databind.JsonSerializer;
6-
import com.fasterxml.jackson.databind.SerializerProvider;
7-
import com.fasterxml.jackson.databind.ser.ResolvableSerializer;
3+
import tools.jackson.core.JacksonException;
4+
import tools.jackson.core.JsonGenerator;
85
import io.swagger.v3.oas.models.examples.Example;
6+
import tools.jackson.databind.DatabindException;
7+
import tools.jackson.databind.SerializationContext;
8+
import tools.jackson.databind.ValueSerializer;
99

10-
import java.io.IOException;
10+
public class ExampleSerializer extends ValueSerializer<Example> {
1111

12-
public class ExampleSerializer extends JsonSerializer<Example> implements ResolvableSerializer {
12+
private ValueSerializer<Object> defaultSerializer;
1313

14-
private JsonSerializer<Object> defaultSerializer;
15-
16-
public ExampleSerializer(JsonSerializer<Object> serializer) {
14+
public ExampleSerializer(ValueSerializer<Object> serializer) {
1715
defaultSerializer = serializer;
1816
}
1917

2018
@Override
21-
public void resolve(SerializerProvider serializerProvider) throws JsonMappingException {
22-
if (defaultSerializer instanceof ResolvableSerializer) {
23-
((ResolvableSerializer) defaultSerializer).resolve(serializerProvider);
24-
}
19+
public void resolve(SerializationContext serializerProvider) throws DatabindException {
20+
defaultSerializer.resolve(serializerProvider);
2521
}
2622

2723
@Override
2824
public void serialize(
29-
Example example, JsonGenerator jgen, SerializerProvider provider)
30-
throws IOException {
25+
Example example, JsonGenerator jgen, SerializationContext provider)
26+
throws JacksonException {
3127

3228
if (example.getValueSetFlag() && example.getValue() == null) {
3329
jgen.writeStartObject();
3430
defaultSerializer.unwrappingSerializer(null).serialize(example, jgen, provider);
35-
jgen.writeNullField("value");
31+
jgen.writeNullProperty("value");
3632
jgen.writeEndObject();
3733
} else {
3834
defaultSerializer.serialize(example, jgen, provider);

modules/swagger-core/src/main/java/io/swagger/v3/core/jackson/JAXBAnnotationsHelper.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
package io.swagger.v3.core.jackson;
22

3-
import com.fasterxml.jackson.databind.introspect.Annotated;
3+
import tools.jackson.databind.introspect.Annotated;
44
import io.swagger.v3.core.util.AnnotationsUtils;
55
import io.swagger.v3.oas.models.media.ArraySchema;
66
import io.swagger.v3.oas.models.media.MapSchema;

0 commit comments

Comments
 (0)