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

350
Vistas
Spring Boot: diferentes instancias de ObjectMapper para solicitud y respuesta

Tengo el siguiente controlador en mi aplicación Spring Boot:

 @RequestMapping(method = RequestMethod.POST) public ResponseEntity<ResponseDto<MyClass> process(@RequestBody RequestDto<MyClass> request){ return null; }

MyClass tiene un campo, digamos 'myField' y quiero una configuración diferente de NamingStrategy para solicitud y respuesta para este campo (esto se debe a que no quiero crear una nueva clase solo para un campo). He configurado la instancia de ObjectMapper de la siguiente manera:

 @Bean public ObjectMapper objectMapper(){ ObjectMapper objectMapper = new ObjectMapper(); objectMapper.setPropertyNamingStrategy(namingStrategy); return objectMapper; }

Esto se usará tanto para Solicitud como para Respuesta (es decir, deserialización y serialización), ¿hay alguna forma en el arranque de primavera por la cual pueda indicarle al controlador que use diferentes instancias de ObjectMapper ?

over 4 years ago · Santiago Trujillo
3 Respuestas
Responde la pregunta

0

Puedes resolverlo con negociación de contenido . En primer lugar, defina su HttpMessageConverter personalizado. En el siguiente ejemplo, he definido un convertidor personalizado que se aplica cuando el encabezado Content-Type la solicitud se establece en application/test+json :

 @Bean public HttpMessageConverters customConverters() { final AbstractJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter(new ObjectMapper()); converter.setSupportedMediaTypes(Collections.singletonList(MediaType.valueOf("application/test+json"))); return new HttpMessageConverters(true, Collections.singletonList(converter)); }

Para simplificar este ejemplo, he usado ObjectMapper recién creado; en su caso, tendrá que pasar aquí el objeto previamente configurado.

Lo siguiente es decirle a su acción que acepte solo solicitudes de appliction/test+json (tenga en cuenta que, a partir de ahora, requiere que el Content-Type:application/test+json se presente en cada solicitud a este punto final):

 @RequestMapping(method = RequestMethod.POST, consumes = "application/test+json") public ResponseEntity<ResponseDto<MyClass> process(@RequestBody RequestDto<MyClass> request){ return null; }

Lo último es asegurarse de que cuando llame a este punto final, se establezca el encabezado Content-Type:application/test+json . Por supuesto, puede usar cualquier otro nombre para el tipo de contenido deseado, el nombre presentado es solo un ejemplo.

over 4 years ago · Santiago Trujillo Denunciar

0

Puede usar un modificador de deserialización en su ObjectMapper para anular el conjunto de funciones habilitadas en el momento de la deserialización del objeto a través de un módulo. Este debería hacer el truco:

 public class FeatureModifyingBeanDeserializerModifier extends BeanDeserializerModifier { private Collection<Class<?>> modifiedClasses; public FeatureModifyingBeanDeserializerModifier(Collection<Class<?>> modifiedClasses) { this.modifiedClasses = Collections.unmodifiableSet(new HashSet<Class<?>>(modifiedClasses)); } @Override public JsonDeserializer<?> modifyDeserializer( DeserializationConfig config, BeanDescription beanDesc, final JsonDeserializer<?> deserializer) { JsonDeserializer<?> result = deserializer; Class<?> beanClass = beanDesc.getBeanClass(); if (modifiedClasses.contains(beanClass)) { result = new FeatureModifyingStdDeserializer(deserializer, beanClass); } return result; } private static class FeatureModifyingStdDeserializer extends StdDeserializer<Object> { private JsonDeserializer<?> deserializer; private FeatureModifyingStdDeserializer( JsonDeserializer<?> deserializer, Class<?> beanClass) { super(beanClass); this.deserializer = deserializer; } @Override public Object deserialize(JsonParser p, DeserializationContext ctxt) throws IOException { p.enable(JsonParser.Feature.ALLOW_BACKSLASH_ESCAPING_ANY_CHARACTER); return deserializer.deserialize(p, ctxt); } } }

Tienes que registrarlo con ObjectMapper como un módulo como este:

 ObjectMapper objectMapper = new ObjectMapper(); SimpleModule module = new SimpleModule(); module.setDeserializerModifier(new FeatureModifyingBeanDeserializerModifer(Arrays.asList(Journey.class))); objectMapper.registerModule(module);

Para la serialización, puede agregar una anotación @JsonSerialize a la clase Journey y serializarla de la forma que desee. Si necesita escribir una cadena sin escape, puede usar writeRaw de JsonGenerator.

over 4 years ago · Santiago Trujillo Denunciar

0

Un truco sucio: puede escribir un serializador y deserializador personalizado para MyClass, allí usa explícitamente dos mapeadores de objetos separados, uno para serialización (para respuesta) y el segundo para deserialización (para solicitud).

Pero es mejor encontrar una manera de personalizar explícitamente el mapeador de objetos de primavera.

over 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