Estoy usando un objeto de dominio importado de otro servicio que implementa un patrón de construcción y, por lo tanto, no tiene constructor ni configuradores sin argumentos. Quiero asignar JSON procedente de @RequestBody a este objeto de dominio. Sé que puedo anotarlo con @JSONPojoBuilder y algunos otros, pero no tengo control sobre eso. Así que estoy atascado escribiendo mi propio mapeador de JSON a objetos, lo que no creo que sea una buena idea, ya que implica validaciones, etc. y está estrechamente relacionado con el cuerpo de la solicitud.
Código -
@RequestMapping(value = "someurl", method = RequestMethod.POST) public ResponseEntity<ObjectA> addObject(@PathVariable String id, @RequestBody @NonNull String body) { ObjectA obj = service.addObject(id, mapper.mapJSONToObject(body)); return new ResponseEntity<>(obj , HttpStatus.CREATED); }En lugar de escribir mi propio mapeador, escuché que podemos usar algún convertidor de mensajes y pasar nuestra clase Builder como argumento. No encontré tales ejemplos, si alguien lo ha hecho antes o puede indicarme algún sitio, sería útil.
Nunca lo probé, pero en general, Spring MVC admite la abstracción de "Convertidores personalizados" que puede escribir para ayudar a Spring a convertir JSON en objetos complicados.
Supongo que tiene un MyComplicatedClass sin constructor sin operaciones pero con un constructor. Así que puedes hacer lo siguiente:
import org.springframework.core.convert.converter.Converter; @Component // note the converter is also a spring bean so you can, say, inject object mapper and convert to JsonNode-s for example (see below) public class MyComplicatedClassConverter implements Converter<String, MyComplicatedClass> { @Autowired // or use constructor injection private ObjectMapper objectMapper; /** * Override the convert method * @param object in a string representation to be converted * @return */ @Override public MyComplicatedClass convert(String object) { JsonNode node= objectMapper.readTree(/*byte array input stream from object string or something */); return MyComplicatedClass.builder() .withSomeProperty(node.get("someProperty").textValue() .withAnotherProperty(node.get("anotherProperty").intValue() .build(); } } Ahora, cuando su aplicación reconoce este convertidor, permite usar MyComplicatedClass en los métodos del controlador como si Spring supiera cómo convertirlo. Entonces, el fragmento de código que ha presentado en su ejemplo debería funcionar.
Todo esto se hace sin "tocar" el código de MyComplicatedClass .