我需要使用jsr批注/ spring rest验证日期
@Email(regexp = ".+@.+\\..+")
private String email;
@NotNull
@JsonFormat(pattern="yyyy-MM-dd")
private LocalDate dateOfBirth;
但是它接受json请求以下
{ "email": "eerwer@gmail.com","dateOfBirth": 7,}
及其解析日期为 1970-01-07 (从1970年开始增加7天)
甚至下面的注释也允许数字
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd")
如何使该请求无效
答案 0 :(得分:1)
最终写出了我自己的解串器
class LocalDateDeserializer extends StdDeserializer<LocalDate> {
protected LocalDateDeserializer(){
super(LocalDate.class);
}
@Override
public LocalDate deserialize(JsonParser jp, DeserializationContext ctxt)
throws IOException, JsonProcessingException {
return LocalDate.parse(jp.readValueAs(String.class));
}
}
答案 1 :(得分:1)
替代方法:
请注意,LocalDateDeserializer
和LocalDateTimeDeserializer
内部支持leniency
功能。
话虽如此,但您可以通过Bean提供一个干净的解决方案:
@Bean
ObjectMapper objectMapper() {
final ObjectMapper objectMapper = new ObjectMapper();
// make sure you added jackson-datatype-jsr310 dependency
objectMapper.registerModule(new JavaTimeModule());
objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
// option 1
objectMapper.setDefaultLeniency(FALSE);
// option 2
objectMapper.configOverride(LocalDate.class).setFormat(JsonFormat.Value.forLeniency(FALSE));
objectMapper.configOverride(LocalDateTime.class).setFormat(JsonFormat.Value.forLeniency(FALSE));
return objectMapper;
}
另一种就地替代方法可能是:
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd", lenient = OptBoolean.FALSE)
关于现场/方法本身
答案 2 :(得分:0)
使用jsr注释春季休假验证日期。
添加依赖项
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-jsr310</artifactId>
</dependency>
这样的实体字段。
@JsonFormat(pattern="yyyy-MM-dd")
@DateTimeFormat(iso = DateTimeFormat.ISO.DATE)
private LocalDate expireDate;
Json这样的请求。
{
"expireDate" :"2015-01-01"
}