I've two classes A
& B
which are implementing an interface.
public class A implements MyInterface {
// Class A stuff
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
public class B implements MyInterface {
//Class B stuff
private MyCustomClass myCustomclass;
public String getName() {
this.myCustomclass.getName();
}
}
public interface MyInterface {
public String getName();
}
I want to use a single controller method which can work on both A and B depending on which object the frontend sends. So when I try to use Interface, Spring complains no suitable message converter found.
@RequestMapping(value = "/mymethod", method = RequestMethod.POST) public String updateRecord(@RequestBody MyInterface myInterface, HttpServletResponse response) { //Do stuff }
Jackson can determine which implementation is to use to serialize to JSON but it can't determine which to use to deserialize the JSON. For serializing, all it needs to do is call getClass() and build a serializer for that type. But there is (currently) no such type information when deserializing. You should use the Jackson annotations @JsonTypeInfo
and @JsonSubTypes
to achieve polymorphic json.
@JsonTypeInfo(use = Id.NAME, include = As.PROPERTY, property = "type")
@JsonSubTypes({@JsonSubTypes.Type(value = A.class, name = "A"),
@JsonSubTypes.Type(value = B.class, name = "B")})
public interface MyInterface {
}
Then the request body myInterface
must be,
{type:'A', name:'My name'}
or {type:'B', myCustomclass:{....}}
Refer these three :
Spring MVC @RequestBody into an Interface instead of a class
https://github.com/FasterXML/jackson-docs/wiki/JacksonPolymorphicDeserialization
Spring @RequestBody containing a list of different types (but same interface)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With