我正在使用Spring Boot
Jackson
序列化/反序列化JSON请求/响应。在尝试反编译ISO格式的Date
时,我遇到了一种我想避免的行为。
当我使用无效的月份或月份时,杰克逊通过在日期中添加额外的天数/月来处理它。
例如
{
"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
有没有办法以某种方式强制执行验证?我查看了Serialization和Deserialization功能列表,但我无法找到任何可能影响此行为的内容。
我正在使用旧的Java Date API - java.util.Date
。
答案 0 :(得分:4)
你的回答指出了正确的方向。 Jackson使用@JsonFormat
之后的2.9+
注释支持宽大配置。
@JsonFormat(lenient = OptBoolean.FALSE)
因此,当我使用jackson.version
父POM时,我所要做的就是覆盖POM中Spring Boot
属性的值。
<jackson.version>2.9.4</jackson.version>
再次感谢!
答案 1 :(得分:3)
由于您使用的是旧版API,请在与您正在使用的setLenient(false)
关联的Calendar
上调用DateFormat
,以启用严格模式。
答案 2 :(得分:2)
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss+01:00");
sdf.setLenient(false);
objectMapper.setDateFormat(sdf);
类似的问题:Jackson ObjectMapper : Issues with date serialization and deserialization
答案 3 :(得分:1)
正如您提到的那样使用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
<{1}} ObjectMapper
@Autowired
private ObjectMapper mapper;