Estoy usando Spring Boot con Jackson serializando / deserializando solicitudes / respuestas JSON. Me he encontrado con un comportamiento al intentar deserializar Date en formato ISO que me gustaría evitar.

Cuando uso un día o mes del año no válido, Jackson lo maneja agregando la cantidad adicional de días / meses a la fecha.

Por ejemplo,

{
    "date": "2018-02-40T15:00:00+01:00"
}

Se deserializa como Mon Mar 12 15:00:00 CET 2018

O

{
    "date": "2018-14-20T15:00:00+01:00"
}

Como Wed Feb 20 15:00:00 CET 2019

¿Hay alguna manera de hacer cumplir una validación de alguna manera? Estaba mirando la lista de Serialización y Deserialización, pero no pude encontrar ninguno que pudiera influir en este comportamiento.

Estoy usando la antigua API de Java Date - java.util.Date.

1
Tomas Kralik 22 feb. 2018 a las 21:24

4 respuestas

La mejor respuesta

Sus respuestas me indicaron la dirección correcta. Jackson admite la configuración de clemencia utilizando la anotación @JsonFormat desde 2.9+.

@JsonFormat(lenient = OptBoolean.FALSE)

Así que todo lo que tuve que hacer fue anular el valor de la propiedad jackson.version en POM ya que estoy usando el POM principal Spring Boot.

<jackson.version>2.9.4</jackson.version>

¡Gracias de nuevo!

5
Tomas Kralik 23 feb. 2018 a las 12:29

Como está utilizando la API anterior, active el modo estricto llamando a setLenient(false) en el Calendar asociado con el DateFormat que está utilizando.

4
Andreas 22 feb. 2018 a las 18:40
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss+01:00"); 
sdf.setLenient(false);
objectMapper.setDateFormat(sdf);

Una pregunta similar: Jackson ObjectMapper: Problemas con la serialización de fechas y la deserialización

3
Priya Jain 22 feb. 2018 a las 19:14

Como mencionaste usando spring-boot,
Puede crear una configuración para su ObjectMapper

@Configuration
public class ObjectMapperConfig {
    @Bean
    public ObjectMapper objectMapper(){
        ObjectMapper mapper = new ObjectMapper();

        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss+01:00");
        simpleDateFormat.setLenient(false);
        mapper.setDateFormat(simpleDateFormat);

        return mapper;
    }
}

Y luego, cada vez que quiera usar solo inject su ObjectMapper

@Autowired
private ObjectMapper mapper;
1
Daniel Taub 23 feb. 2018 a las 09:11