Tengo dos clases A y B que están implementando una interfaz.
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(); }Quiero usar un método de controlador único que pueda funcionar tanto en A como en B, según el objeto que envíe la interfaz. Entonces, cuando trato de usar la interfaz, Spring se queja de que no se encontró un convertidor de mensajes adecuado.
@RequestMapping(value = "/mymethod", method = RequestMethod.POST) public String updateRecord(@RequestBody MyInterface myInterface, HttpServletResponse response) { //Do stuff }
Jackson puede determinar qué implementación usar para serializar a JSON, pero no puede determinar cuál usar para deserializar JSON. Para serializar, todo lo que necesita hacer es llamar a getClass() y construir un serializador para ese tipo. Pero (actualmente) no hay tal tipo de información cuando se deserializa. Debe usar las anotaciones de Jackson @JsonTypeInfo y @JsonSubTypes para lograr json polimórfico.
@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 { } Entonces el cuerpo de la solicitud myInterface debe ser,
{type:'A', name:'My name'} o {type:'B', myCustomclass:{....}}
Consulte estos tres:
Spring MVC @RequestBody en una interfaz en lugar de una clase
https://github.com/FasterXML/jackson-docs/wiki/JacksonPolymorphicDeserialization
Spring @RequestBody que contiene una lista de diferentes tipos (pero la misma interfaz)
¿Ha intentado pasar la clase de objeto o pasar la referencia de tipo genérico?
public String updateRecord(@RequestBody Object obj,..o
public String updateRecord(@RequestBody T obj,.. // I am not sure for this Luego verifique instanceOf en su método de controlador.
Según tengo entendido, spring/jackson no podrá reconocer qué tipo de objeto crear a menos que el json entrante mencione explícitamente lo mismo. Vea el enlace a continuación, aunque habla de clases abstractas. Básicamente, hay varias formas de lograr esto, usando jsonTypeinfo o solucionadores de argumentos, etc. Compruebe si esto ayuda. Clases abstractas y Spring MVC @ModelAttribute/@RequestParam