Skip to content

GSON converter only serialises fields of controller method return type, ignoring subclass fields of response object [SPR-16461] #21006

@spring-projects-issues

Description

@spring-projects-issues

Fleur Kelpin opened SPR-16461 and commented

The GSON message converter used to serialise using the class of the object that was being serialised. Now it uses the return type of the controller method.

So when I have

@GetMapping("/animal")
public Animal getAnimal() { return new Cat(...); }

the Cat-specific fields do not get serialised, only Animal fields.

Workarounds:

  • When I replace GSON with Jackson on the classpath, Cat fields get serialised again.
  • When I subclass the GsonHttpMessageSerializer and override writeInternal as follows:
@Override
protected void writeInternal(Object o, @Nullable Type type, Writer writer) throws Exception
{
    // replaces the type info with null value
    super.writeInternal(o, null, writer); 
}

the Cat fields get serialized again.

Probably introduced in #17408, the last version that serialized Cats as Cats was 4.1.9.

To reproduce:
Run the repro project, and GET http://localhost:8080/SPR-16461/animal
Response should be the same as http://localhost:8080/SPR-16461/cat but isn't.


Affects: 4.3.14, 5.0.3

Reference URL: spring-attic/spring-framework-issues#175

Issue Links:

Referenced from: commits 817a836, fd964ca

Backported to: 4.3.15

Metadata

Metadata

Assignees

Labels

in: webIssues in web modules (web, webmvc, webflux, websocket)status: backportedAn issue that has been backported to maintenance branchestype: regressionA bug that is also a regression

Type

No type

Projects

No projects

Milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions