Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java DateTimeFormat接受json请求中的数字而不是日期格式_Java_Spring_Spring Boot_Bean Validation_Jsr - Fatal编程技术网

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

Java DateTimeFormat接受json请求中的数字而不是日期格式,java,spring,spring-boot,bean-validation,jsr,Java,Spring,Spring Boot,Bean Validation,Jsr,我需要使用jsr注释/SpringREST验证日期 @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天) 甚至下面的注

我需要使用jsr注释/SpringREST验证日期

@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 notationspring rest使此请求无效

验证日期

添加依赖项

<dependency>
    <groupId>com.fasterxml.jackson.datatype</groupId>
    <artifactId>jackson-datatype-jsr310</artifactId>
</dependency>
像这样的Json请求

    @JsonFormat(pattern="yyyy-MM-dd")
    @DateTimeFormat(iso = DateTimeFormat.ISO.DATE)
    private LocalDate expireDate;
{
    "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扩展StdDeserializer{
受保护的LocalDateDeserializer(){
super(LocalDate.class);
}
@凌驾
公共LocalDate反序列化(JsonParser jp,反序列化上下文ctxt)
抛出IOException、JsonProcessingException{
返回LocalDate.parse(jp.readValueAs(String.class));
}
}
备选方案:

请注意,
LocalDateDeserializer
LocalDateTimeDeserializer
在内部支持
Lenence
功能

也就是说,您可以通过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)


在字段/方法本身上

是否
出生日期
@RequestBody
对象的一部分?控制器参数是否用
@Valid
注释以触发验证?是@Valid在那里,并且验证也以日期格式进行。唯一的问题是它的允许号码如果我超过7,它会在日期上加7毫秒你的注释是无用的。Spring没有解析JSON。您的JSON解析器(可能是Jackson)是。看见好了,您需要使用自定义反序列化程序来禁止成功解析数字。spring 5.1.4版本当然可以这样做。但这也将接受数字,请尝试{“expireDate”:7}它不接受数字。给出错误。你试过了吗?你能确定你试过这个{“expireDate”:7}而不是{“expireDate”:“7}我试过了。只有“2015-01-01”是有效的。没有7不是“7”。有没有办法用Jackson2ObjectMapperBuilder或自定义程序来做到这一点?我找不到任何方法来做到这一点。