春季验证JSR-303 @NotNull引发NotReadablePropertyException

时间:2018-07-06 12:45:34

标签: java spring bean-validation

我有两个课

@Data
@NoArgsConstructor
public class SearchProductOffer {
    @Valid
    private List<MatchProperty> properties = new ArrayList<>();
}
@Data
@NoArgsConstructor
public class MatchProperty {
    private String version;
    private String sourceSystem;
    @NotNull(message = "Версия должна быть заполнена!")
    public String codeName;
}

当我使用ValidationUtil.invokeValidator验证A时

  

2018-07-06 16:04:09.769错误10223 --- [nio-8080-exec-1]   o.a.c.c.C。[。[。[/]。[dispatcherServlet]:的Servlet.service()   路径[]中的servlet [dispatcherServlet]抛出异常   [请求处理失败;嵌套异常为   java.lang.IllegalStateException:JSR-303验证的属性   'properties [1] .codeName'没有对应的访问器   Spring数据绑定-检查您的DataBinder的配置(bean   属性与直接字段访问)]的根本原因

     

org.springframework.beans.NotReadablePropertyException:无效   Bean类[java.lang.String]的property'properties [1]':Bean   属性“ properties [1]”不可读或具有无效的获取器   方法:getter的返回类型是否与的参数类型匹配   二传手?在   org.springframework.beans.AbstractNestablePropertyAccessor.getPropertyValue(AbstractNestablePropertyAccessor.java:622)   〜[spring-beans-5.0.7.RELEASE.jar:5.0.7.RELEASE]

当fieldB为空时。这两个课程都有getter / setter。 Spring Boot 2.0.3.RELEASE

更新 每次我都会得到异常,而我想在内部类中使用@NotNull(当字段值为null)或@NotEmpty(当我的字段为“”)字段时进行验证。

1 个答案:

答案 0 :(得分:0)

解决方案:卸下弹簧 SmartValidator 。 在控制器中配置活页夹

@InitBinder
    private void initBinder(WebDataBinder dataBinder) {
        dataBinder.initDirectFieldAccess();
    }

在启动配置中配置验证器

@Bean
    public LocalValidatorFactoryBean getValidator() {
        return new LocalValidatorFactoryBean();
    }

并将其注入控制器

@Autowired
    private LocalValidatorFactoryBean validator;

之后,我们可以致电

List<ConstraintViolation<Object>> validationResult = new ArrayList<>();
validationResult.addAll(validator.validate(request));   
validationResult.addAll(validator.validate(methodBean));     

并检查 validationResult 中是否存在验证错误