DateTimeFormat 接受 json 请求中的数字而不是日期格式
DateTimeFormat accepting numbers in json request instead of date format
我需要使用 jsr 注释验证日期/spring 其余
@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")
我怎样才能使这个请求无效
使用 jsr notationsspring rest 验证日期。
添加依赖
<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"
}
最终编写了我自己的解串器
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));
}
}
备选方案:
请注意 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)
field/method 本身
我需要使用 jsr 注释验证日期/spring 其余
@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")
我怎样才能使这个请求无效
使用 jsr notationsspring rest 验证日期。
添加依赖
<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"
}
最终编写了我自己的解串器
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));
}
}
备选方案:
请注意 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)
field/method 本身