Java Spring验证JSR-303@NotNull抛出NotReadablePropertyException

Java Spring验证JSR-303@NotNull抛出NotReadablePropertyException,java,spring,bean-validation,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 St

我有两节课

@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;
}
@数据
@诺尔格构装师
公共类搜索产品提供{
@有效的
私有列表属性=新的ArrayList();
}
@资料
@诺尔格构装师
公共类匹配属性{
私有字符串版本;
专用字符串源系统;
@NotNull(message=“Сжззззззе!”
公共字符串代码名;
}
当我使用ValidationUtil.invokeValidator验证时,我得到

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已验证属性 “属性[1]。代码名”没有对应的访问器 Spring数据绑定-检查DataBinder的配置(bean 不动产与直接现场访问)],有根本原因

org.springframework.beans.NotReadablePropertyException:无效 bean类[java.lang.String]:bean的属性“properties[1]” 属性“properties[1]”不可读或具有无效的getter 方法:getter的返回类型是否与 二传手 org.springframework.beans.AbstractNestablePropertyAccessor.getPropertyValue(AbstractNestablePropertyAccessor.java:622) ~[spring-beans-5.0.7.RELEASE.jar:5.0.7.RELEASE]

当fieldB为null时。两个类都有getter/setter。 弹簧靴2.0.3.0版本

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

解决方案:删除springSmartValidator。 在控制器中配置活页夹

@InitBinder
    private void initBinder(WebDataBinder dataBinder) {
        dataBinder.initDirectFieldAccess();
    }
@Autowired
    private LocalValidatorFactoryBean validator;
在引导配置中配置验证程序

@Bean
    public LocalValidatorFactoryBean getValidator() {
        return new LocalValidatorFactoryBean();
    }
并将其注入控制器

@InitBinder
    private void initBinder(WebDataBinder dataBinder) {
        dataBinder.initDirectFieldAccess();
    }
@Autowired
    private LocalValidatorFactoryBean validator;
之后我们可以打电话

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

然后检查验证错误的validationResult

getter和setter是公共的吗?错误消息似乎与您的代码没有任何关系。发布真实的代码以再现问题,并带有真实完整的异常堆栈跟踪。我使用lombok@Data,在*.class文件中看到getter和setter,我会说t问题不在于验证,而在于HTML中的路径不正确。看起来您在路径中的某个位置使用了
属性[1]
。请发布您使用的JSP我使用jackson objectMapper从json获取对象。反序列化后,我得到普通java对象,一些字段有空值。带有空值的字段用@NotNull(代码名)注释。我调用SmartValidator.validate,然后得到异常。我验证完整有效的java对象,SmartValidator.validate必须从codeName字段创建FieldError,但它会引发异常