Avoid using generated Jackson serializers for subclasses #46211
Merged
+121
−6
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.
Fixes #46156
The reason why it requires 2 different endpoints to reproduce the problem is the following: in the reproducer one endpoint returned objects of class A and the second of class B extending A. The serializer for A is correctly generated and registered. Conversely the serializer for B cannot be generated because the class contains an unknown annotation (
JsonIgnore
in this case, but this pull request also adds support for it), so Jackson should use the default, reflection based, serializer. However, as discussed here since there's a registered serializer for A and B is also an instance of A, Jackson decides to use the serializer generated for A, thus leaving out the properties of B during serialization. Without the endpoint returning instances of A, no serializers is generated for that class, so the problem doesn't happen. Note that this problem also doesn't happen for deserializers because (for some reason) in that case Jackson use a generated deserializer only if there is one registered exactly for it.