Personalización de Convertidores de Mensajes en Spring MVC

La configuración personalizada de conevrsión de tipos evita problemas en operaciones SQL causados por redondeo en valores Long. Esta implementación garantiza precisión en transferecnias de datos entre cliente y servidor.

Clase de configuración principal:

package com.ejemplo.config;

import com.ejemplo.util.CustomObjectMapper;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;
import java.util.List;

@Configuration
public class ConfiguracionWeb extends WebMvcConfigurationSupport {

    @Override
    protected void extendMessageConverters(List<HttpMessageConverter<?>> convertidores) {
        MappingJackson2HttpMessageConverter convertidorPrincipal = new MappingJackson2HttpMessageConverter();
        convertidorPrincipal.setObjectMapper(new CustomObjectMapper());
        convertidores.add(0, convertidorPrincipal);
    }
}

Mapeador JSON personalizado:

package com.ejemplo.util;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.module.SimpleModule;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateDeserializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.math.BigInteger;

public class CustomObjectMapper extends ObjectMapper {

    private static final String FORMATO_FECHA = "yyyy-MM-dd HH:mm:ss";

    public CustomObjectMapper() {
        SimpleModule moduloPersonalizado = new SimpleModule()
            .addSerializer(Long.class, ToStringSerializer.instance)
            .addSerializer(BigInteger.class, ToStringSerializer.instance)
            .addSerializer(LocalDateTime.class, 
                new LocalDateTimeSerializer(DateTimeFormatter.ofPattern(FORMATO_FECHA)))
            .addDeserializer(LocalDateTime.class,
                new LocalDateDeserializer(DateTimeFormatter.ofPattern(FORMATO_FECHA)));
        
        this.registerModule(moduloPersonalizado);
        this.configure(FAIL_ON_UNKNOWN_PROPERTIES, false);
    }
}

Esta implementación serializa tipos Long como cadenas para mantener precisión numérica y define formatos consistentes para fechas. Los convertidores modifiacdos procesan automáticamente las conversiones en peticiones y respuestas HTTP

Etiquetas: Spring MVC jackson serialización JSON java Configuración Web

Publicado el 8-20 07:06