DateTimeFormat在json请求中接受数字,而不是日期格式

时间:2019-02-25 15:28:25

标签: java spring spring-boot bean-validation jsr

我需要使用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")

如何使该请求无效

3 个答案:

答案 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)

替代方法:

请注意,LocalDateDeserializerLocalDateTimeDeserializer内部支持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"
}