Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

234
Vistas
Usar la interfaz en el argumento del método del controlador Spring

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 }
about 4 years ago · Santiago Trujillo
3 Respuestas
Responde la pregunta

0

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)

about 4 years ago · Santiago Trujillo Denunciar

0

¿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.

about 4 years ago · Santiago Trujillo Denunciar

0

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

about 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda