-
Couldn't load subscription status.
- Fork 38.8k
Description
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:
- Make @ResponseBody method return type available to message converters [SPR-12811] #17408 Make
@ResponseBodymethod return type available to message converters - GsonHttpMessageConverter cannot be used in an SseEmitter because it closes the response stream [SPR-16529] #21072 GsonHttpMessageConverter cannot be used in an SseEmitter because it closes the response stream
Referenced from: commits 817a836, fd964ca
Backported to: 4.3.15