首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Spring验证@NotNull不验证

Spring验证@NotNull不验证
EN

Stack Overflow用户
提问于 2018-07-31 10:57:12
回答 2查看 13.2K关注 0票数 1

我正在尝试使用Spring Validator验证POST请求。这是我正在尝试验证的对象:

代码语言:javascript
复制
@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.
}

这是Mapping类:

代码语言:javascript
复制
@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;
    }
}

这是正在发布的消息:

代码语言:javascript
复制
[Request [id1=null, id2=null, s=6eq2J6, mappings=

[Mapping [id=2779, string=6eq2J6, accountId=null, lastUpdatedAt=null]]]]

这就是我接收请求的方式,但是bindingResult.hasErrors()总是空的。pushRequest与发送时完全相同。

代码语言:javascript
复制
@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 and MappingController类中,但这并没有解决问题。

另一种解决方案是将这些Beans添加到Main()类中,但这并没有解决问题。

代码语言:javascript
复制
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;
    }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-07-31 11:31:43

多亏了这篇文章,我想我找到了答案:

jsr-303-valid-annotation-nested-object-not-working

所以只要我将@Valid添加到这些字段中:

代码语言:javascript
复制
@Valid
private List<Mapping> mappings;

以及Mapping中的以下字段:

代码语言:javascript
复制
@JsonProperty(value="account_id")
    @Valid
    @NotNull
    private String accountId;

    @JsonProperty(value="last_updated_at")
    @Valid
    @NotNull    
    private OffsetDateTime lastUpdatedAt;

验证已开始工作。

我还删除了setter()方法中的@NotNull

Setters()如下所示:

代码语言:javascript
复制
@Override
    public void setAccountId (String accountId) {
        this.accountId = accountId;
    }    

    @Override
    public void setLastUpdatedAt(OffsetDateTime lastUpdatedAt) {
        this.lastUpdatedAt = lastUpdatedAt;
    }

此外,我的代码在没有添加到Main()中的任何Validator bean的情况下也可以工作。

票数 5
EN

Stack Overflow用户

发布于 2021-04-10 16:13:46

在我的例子中,我缺少验证依赖项。来自baeldung

Starting with Boot 2.3, we also need to explicitly add the spring-boot-starter-validation dependency:

代码语言:javascript
复制
<dependency> 
    <groupId>org.springframework.boot</groupId> 
    <artifactId>spring-boot-starter-validation</artifactId> 
</dependency>
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51604833

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档