Encode Gson request bodies using the runtime class - #3535
Open
tanvir-ux wants to merge 1 commit into
Open
Conversation
GsonEncoder passed the declared parameter type into gson.toJson, so subclass fields on an abstract request body type were dropped. When bodyType is a raw Class, encode with object.getClass(). Parameterized types keep the declared TypeToken so generic arguments are not erased. Fixes OpenFeign#2485
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
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
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 #2485.
Problem
When a Feign method declares an abstract (or superclass) body type,
GsonEncoderserializes only the fields on that declared type. Fields on the concrete subclass never appear in the JSON.Root cause
GsonEncoder.encodecalledgson.toJson(object, bodyType). Gson treats the second argument as the schema, so aSimpleTextMessagepassed asMessageis written as{"toUser":"..."}.Fix
If
bodyTypeis a rawClass, serialize withobject.getClass(). Parameterized types (TypeToken/ generics) still use the declared type so type arguments are not erased. Jackson and the other encoders are unchanged.Tests
GsonCodecTest.encodesSubclassFieldsWhenBodyTypeIsAbstractencodes a subclass as the abstract type and asserts the JSON includes the subclass fields. Existing TypeToken encoding tests still pass../mvnw test -pl gson -am(gson: 11 tests, 0 failures).