blu*_*Sky 1 java spring spring-validator spring-boot spring-restcontroller
我正在尝试使用 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.
}
Run Code Online (Sandbox Code Playgroud)
这是映射类:
@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;
}
}
Run Code Online (Sandbox Code Playgroud)
这是发布的消息:
[Request [id1=null, id2=null, s=6eq2J6, mappings=
[Mapping [id=2779, string=6eq2J6, accountId=null, lastUpdatedAt=null]]]]
Run Code Online (Sandbox Code Playgroud)
这就是我接收请求的方式,但 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!");
}
}
}
Run Code Online (Sandbox Code Playgroud)
为什么@NotNullfor accountId 和 lastUpdatedAt 在它们有Null值时不会使验证失败?
我试图通过搜索这个错误来找到解决方案,解决方案是添加@Validated到Request, Mapping and 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;
}
}
Run Code Online (Sandbox Code Playgroud)
由于这篇文章,我想我找到了答案:
jsr-303-valid-annotation-nested-object-not-working
因此,一旦我将 @Valid 添加到这些字段中:
@Valid
private List<Mapping> mappings;
Run Code Online (Sandbox Code Playgroud)
以及 Mapping 中的这些字段:
@JsonProperty(value="account_id")
@Valid
@NotNull
private String accountId;
@JsonProperty(value="last_updated_at")
@Valid
@NotNull
private OffsetDateTime lastUpdatedAt;
Run Code Online (Sandbox Code Playgroud)
验证开始工作。
我也删除@NotNull了setter()方法中的:
Setters() 像这样:
@Override
public void setAccountId (String accountId) {
this.accountId = accountId;
}
@Override
public void setLastUpdatedAt(OffsetDateTime lastUpdatedAt) {
this.lastUpdatedAt = lastUpdatedAt;
}
Run Code Online (Sandbox Code Playgroud)
此外,我的代码在没有添加到 Main() 的任何 Validator bean 的情况下也能工作。
| 归档时间: |
|
| 查看次数: |
12389 次 |
| 最近记录: |