我将使用Spring Validator来验证一个POST请求。这是我要验证的对象:
@Validated
public class Request implements Serializable {
private static final long serialVersionUID = 1L;
private Long id1;
private Long id2;
private String s;
private List<Mapping> mappings;
public Request() {}
public Request (Long id1, Long id2, String s, List<Mapping> mappings) {
this.id1 = id1;
this.id2 = id2;
this.s = s;
this.mappings = mappings;
}
//getter() and setter() methods.
}
这是映射类:
@Validated
public class Mapping implements Serializable {
private static final long serialVersionUID = 1L;
@JsonProperty(value="id")
private Long id;
@JsonProperty(value="string")
private String string;
@JsonProperty(value="account_id")
@NotNull
private String accountId;
@JsonProperty(value="last_updated_at")
@NotNull
private OffsetDateTime lastUpdatedAt;
// Getter and setters()
// I'll skip the getter() and setter() for id and string fields.
@Override
public String getAccountId() {
return accountId;
}
@Override
public void setAccountId (@NotNull String accountId) {
this.accountId = accountId;
}
@Override
public OffsetDateTime getLastUpdatedAt() {
return lastUpdatedAt;
}
@Override
public void setLastUpdatedAt(@NotNull OffsetDateTime lastUpdatedAt) {
this.lastUpdatedAt = lastUpdatedAt;
}
}
这是要发布的信息:
[Request [id1=null, id2=null, s=6eq2J6, mappings=
[Mapping [id=2779, string=6eq2J6, accountId=null, lastUpdatedAt=null]]]]
这是我收到请求的方式,但bindingResult.hasErrors()始终为空。pushRequest与发送时完全一致。
@RestController
@RequestMapping(value="/${path}", method={RequestMethod.GET, RequestMethod.POST, RequestMethod.PUT})
@Validated
public class MappingController {
@PostMapping(value="/", consumes={"application/json"})
public void processMappings (@Valid @RequestBody Optional<Request> pushRequest, BindingResult bindingResult) {
if (bindingResult.hasErrors()) {
log.info("Error!");
}
}
}
为什么accountId和lastUpdatedAt上的@NotNull注解在它们为Null值时不会使验证失败?
我已经尝试通过搜索此错误来找到解决方案,解决方案是将@Validated添加到Request、Mapping和MappingController类中,但这并没有解决问题。
另一个解决方案是将这些Beans添加到Main()类中,但这也没有解决问题。
public class Main {
public static void main(String[] args) {
SpringApplication.run(Main.class, args);
//System.out.println("version: " + SpringVersion.getVersion()); // version: 5.1.0.RC1
}
@Bean
public javax.validation.Validator localValidatorFactoryBean() {
return new LocalValidatorFactoryBean();
}
@Bean
public MethodValidationPostProcessor methodValidationPostProcessor() {
MethodValidationPostProcessor mvProcessor = new MethodValidationPostProcessor();
mvProcessor.setValidator(validator());
return mvProcessor;
}
@Bean
public LocalValidatorFactoryBean validator() {
LocalValidatorFactoryBean validator = new LocalValidatorFactoryBean();
validator.setProviderClass(HibernateValidator.class);
validator.afterPropertiesSet();
return validator;
}
}