Я использую Spring Boot с Jackson сериализацией / десериализацией запросов / ответов JSON. При попытке десериализации Date в формате ISO я столкнулся с поведением, которого я хотел бы избежать.

Когда я использую недопустимый день месяца или месяца года, Джексон обрабатывает его, добавляя дополнительное число дней / месяцев к дате.

Например

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

Десериализуется как Mon Mar 12 15:00:00 CET 2018

Или же

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

Как Wed Feb 20 15:00:00 CET 2019

Есть ли способ как-то провести проверку? Я просматривал список сериализации и функции десериализации, но я не смог найти ничего, что могло бы повлиять на это поведение.

Я использую старый Java Date API - java.util.Date.

1
Tomas Kralik 22 Фев 2018 в 21:24

4 ответа

Лучший ответ

Ваши ответы указали мне правильное направление. Джексон поддерживает настройку снисхождения, используя аннотацию @JsonFormat, начиная с 2.9+.

@JsonFormat(lenient = OptBoolean.FALSE)

Поэтому все, что мне нужно было сделать, это переопределить значение свойства jackson.version в POM, поскольку я использую родительский POM Spring Boot.

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

Еще раз спасибо!

5
Tomas Kralik 23 Фев 2018 в 12:29

Поскольку вы используете старый API, включите строгий режим, вызвав setLenient(false) в Calendar, связанный с DateFormat вы используете.

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

Аналогичный вопрос: Jackson ObjectMapper: проблемы с сериализацией и десериализацией даты

3
Priya Jain 22 Фев 2018 в 19:14

Как вы упомянули, вы используете spring-boot,
Вы можете создать конфигурацию для своего 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;
    }
}

И затем каждый раз, когда вы хотите использовать только inject ваш ObjectMapper

@Autowired
private ObjectMapper mapper;
1
Daniel Taub 23 Фев 2018 в 09:11