-
Notifications
You must be signed in to change notification settings - Fork 40
Implement Jackson3 support and maintain Jackson2 support #117
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Open
smals-mavh
wants to merge
2
commits into
OpenAPITools:master
Choose a base branch
from
smals-mavh:implement-jackson3-with-jackson2-support
base: master
Could not load branches
Branch not found: {{ refName }}
Loading
Could not load tags
Nothing to show
Loading
Are you sure you want to change the base?
Some commits from the old base branch may be removed from the timeline,
and old review comments may become outdated.
Open
Changes from all commits
Commits
File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
38 changes: 38 additions & 0 deletions
38
src/main/java/org/openapitools/jackson/nullable/JsonNullableJackson3BeanPropertyWriter.java
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,38 @@ | ||
| package org.openapitools.jackson.nullable; | ||
|
|
||
| import tools.jackson.core.JsonGenerator; | ||
| import tools.jackson.databind.PropertyName; | ||
| import tools.jackson.databind.SerializationContext; | ||
| import tools.jackson.databind.ser.BeanPropertyWriter; | ||
| import tools.jackson.databind.util.NameTransformer; | ||
|
|
||
| public class JsonNullableJackson3BeanPropertyWriter extends BeanPropertyWriter { | ||
|
|
||
| protected JsonNullableJackson3BeanPropertyWriter(BeanPropertyWriter base) { | ||
| super(base); | ||
| } | ||
|
|
||
| protected JsonNullableJackson3BeanPropertyWriter(BeanPropertyWriter base, PropertyName newName) { | ||
| super(base, newName); | ||
| } | ||
|
|
||
| @Override | ||
| protected BeanPropertyWriter _new(PropertyName newName) { | ||
| return new JsonNullableJackson3BeanPropertyWriter(this, newName); | ||
| } | ||
|
|
||
| @Override | ||
| public BeanPropertyWriter unwrappingWriter(NameTransformer unwrapper) { | ||
| return new UnwrappingJsonNullableJackson3BeanPropertyWriter(this, unwrapper); | ||
| } | ||
|
|
||
| @Override | ||
| public void serializeAsProperty(Object bean, JsonGenerator jgen, SerializationContext ctxt) throws Exception { | ||
| Object value = get(bean); | ||
| if (JsonNullable.undefined().equals(value) || (_nullSerializer == null && value == null)) { | ||
| return; | ||
| } | ||
| super.serializeAsProperty(bean, jgen, ctxt); | ||
| } | ||
|
|
||
| } |
93 changes: 93 additions & 0 deletions
93
src/main/java/org/openapitools/jackson/nullable/JsonNullableJackson3Deserializer.java
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,93 @@ | ||
| package org.openapitools.jackson.nullable; | ||
|
|
||
|
|
||
| import tools.jackson.core.JacksonException; | ||
| import tools.jackson.core.JsonParser; | ||
| import tools.jackson.core.JsonToken; | ||
| import tools.jackson.databind.DeserializationConfig; | ||
| import tools.jackson.databind.DeserializationContext; | ||
| import tools.jackson.databind.JavaType; | ||
| import tools.jackson.databind.ValueDeserializer; | ||
| import tools.jackson.databind.deser.ValueInstantiator; | ||
| import tools.jackson.databind.deser.std.ReferenceTypeDeserializer; | ||
| import tools.jackson.databind.jsontype.TypeDeserializer; | ||
| import tools.jackson.databind.type.ReferenceType; | ||
|
|
||
| public class JsonNullableJackson3Deserializer extends ReferenceTypeDeserializer<JsonNullable<Object>> { | ||
|
|
||
|
|
||
| private boolean isStringDeserializer = false; | ||
|
|
||
| /* | ||
| /********************************************************** | ||
| /* Life-cycle | ||
| /********************************************************** | ||
| */ | ||
| public JsonNullableJackson3Deserializer(JavaType fullType, ValueInstantiator inst, | ||
| TypeDeserializer typeDeser, ValueDeserializer<?> deser) { | ||
| super(fullType, inst, typeDeser, deser); | ||
| if (fullType instanceof ReferenceType && ((ReferenceType) fullType).getReferencedType() != null) { | ||
| this.isStringDeserializer = ((ReferenceType) fullType).getReferencedType().isTypeOrSubTypeOf(String.class); | ||
| } | ||
| } | ||
|
|
||
| /* | ||
| /********************************************************** | ||
| /* Abstract method implementations | ||
| /********************************************************** | ||
| */ | ||
|
|
||
| @Override | ||
| public JsonNullable<Object> deserialize(JsonParser p, DeserializationContext ctxt) throws JacksonException { | ||
| JsonToken t = p.currentToken(); | ||
| if (t == JsonToken.VALUE_STRING && !isStringDeserializer) { | ||
| String str = p.getString().trim(); | ||
| if (str.isEmpty()) { | ||
| return JsonNullable.undefined(); | ||
| } | ||
| } | ||
| return super.deserialize(p, ctxt); | ||
| } | ||
|
|
||
| @Override | ||
| protected ReferenceTypeDeserializer<JsonNullable<Object>> withResolved(TypeDeserializer typeDeser, ValueDeserializer<?> valueDeser) { | ||
| return new JsonNullableJackson3Deserializer(_fullType, _valueInstantiator, | ||
| typeDeser, valueDeser); | ||
| } | ||
|
|
||
| @Override | ||
| public Object getAbsentValue(DeserializationContext ctxt) { | ||
| return JsonNullable.undefined(); | ||
| } | ||
|
|
||
| @Override | ||
| public JsonNullable<Object> getNullValue(DeserializationContext ctxt) { | ||
| return JsonNullable.of(null); | ||
| } | ||
|
|
||
| @Override | ||
| public Object getEmptyValue(DeserializationContext ctxt) { | ||
| return JsonNullable.undefined(); | ||
| } | ||
|
|
||
| @Override | ||
| public JsonNullable<Object> referenceValue(Object contents) { | ||
| return JsonNullable.of(contents); | ||
| } | ||
|
|
||
| @Override | ||
| public Object getReferenced(JsonNullable<Object> reference) { | ||
| return reference.get(); | ||
| } | ||
|
|
||
| @Override | ||
| public JsonNullable<Object> updateReference(JsonNullable<Object> reference, Object contents) { | ||
| return JsonNullable.of(contents); | ||
| } | ||
|
|
||
| @Override | ||
| public Boolean supportsUpdate(DeserializationConfig config) { | ||
| // yes; regardless of value deserializer reference itself may be updated | ||
| return Boolean.TRUE; | ||
| } | ||
| } |
23 changes: 23 additions & 0 deletions
23
src/main/java/org/openapitools/jackson/nullable/JsonNullableJackson3Deserializers.java
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,23 @@ | ||
| package org.openapitools.jackson.nullable; | ||
|
|
||
| import tools.jackson.databind.DeserializationConfig; | ||
| import tools.jackson.databind.ValueDeserializer; | ||
| import tools.jackson.databind.BeanDescription.Supplier; | ||
| import tools.jackson.databind.deser.Deserializers; | ||
| import tools.jackson.databind.jsontype.TypeDeserializer; | ||
| import tools.jackson.databind.type.ReferenceType; | ||
|
|
||
| public class JsonNullableJackson3Deserializers extends Deserializers.Base { | ||
|
|
||
| @Override | ||
| public ValueDeserializer<?> findReferenceDeserializer(ReferenceType refType, | ||
| DeserializationConfig config, Supplier beanDescRef, | ||
| TypeDeserializer contentTypeDeserializer, ValueDeserializer<?> contentDeserializer) { | ||
| return (refType.hasRawClass(JsonNullable.class)) ? new JsonNullableJackson3Deserializer(refType, null, contentTypeDeserializer,contentDeserializer) : null; | ||
| } | ||
|
|
||
| @Override | ||
| public boolean hasDeserializerFor(DeserializationConfig config, Class<?> valueType) { | ||
| return JsonNullable.class.equals(valueType); | ||
| } | ||
| } |
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Uh oh!
There was an error while loading. Please reload this page.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
P2: Jackson 3 requires Java 17+, but the build is pinned to Java 8. Adding the Jackson 3 BOM/tools.jackson dependencies will make builds fail with class file version incompatibility unless the toolchain is upgraded or Jackson 3 is isolated.
Prompt for AI agents
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This is a fair point, however, locally I was able to build (and use) this without any issue. (Obviously I have JDK21 installed, but the maven build had no issues with java.version set to 8)
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I guess the .github/workflows should be updated then to JDK17