关于Bean验证,我面临着很奇怪的行为。我有一个个人项目,作为游乐场,使用最新版本的spring boot和JDK 11,在其中创建了一个带有@RequestBody
和@Valid
注释的PUT端点:
@RequestMapping("/change_return")
public class TestController
{
@PutMapping(value = "/change",produces = "application/json")
public ResponseEntity change(@Valid @RequestBody ChangeSchema changeSchema)
{
System.out.println("Rental Agreement: " + changeSchema.getsomeLong());
return ResponseEntity.ok(changeSchema.getsomeLong());
}
}
用于@RequestBody
的类非常简单:
package com.vitorvillar.validation.demo;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import lombok.Getter;
import lombok.Setter;
import javax.validation.constraints.Digits;
import javax.validation.constraints.Future;
import javax.validation.constraints.NotNull;
import java.util.Date;
@Getter
@Setter
public class ChangeSchema
{
@NotNull
@Digits(integer = 10,fraction = 0)
private Long someLong;
@NotNull
@Digits(integer = 5,fraction = 0)
private Integer anotherInt;
@Future
@NotNull
@JsonDeserialize(using = JsonDateDeserializer.class)
private Date someDate;
}
尽管如此,我还有另一个项目使用了该类,并在Spring Boot 2.1和JDK 8上运行。验证和JSON反序列化只是行不通。我必须明确声明@AllArgsConstructor
,并且注释@JsonDeserialize(using = JsonDateDeserializer.class)
在字段级或设置器级的任何地方都无效。我必须注册一个Bean才能显式反序列化Date类型:
@Bean
public Module dateTypeJsonDeserializer()
{
SimpleModule module = new SimpleModule();
module.addDeserializer(Date.class,new JsonDateDeserializer());
return module;
}
有人知道为什么我必须手动做所有这些事情吗?
如果您需要更多信息,请告诉我,我会发布。