【问题标题】:Spring validation JSR-303 @NotNull throw NotReadablePropertyExceptionSpring 验证 JSR-303 @NotNull 抛出 NotReadablePropertyException
【发布时间】:2018-12-15 02:02:20
【问题描述】:

我有两节课

@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() for 带有路径 [] 的上下文中的 servlet [dispatcherServlet] 引发异常 [请求处理失败;嵌套异常是 java.lang.IllegalStateException:JSR-303 验证的属性 'properties[1].codeName' 没有对应的访问器 Spring 数据绑定 - 检查 DataBinder 的配置(bean 属性与直接字段访问)] 根本原因

org.springframework.beans.NotReadablePropertyException: 无效 bean 类 [java.lang.String] 的属性“properties [1]”:Bean 属性 'properties[1]' 不可读或具有无效的 getter method: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(字段值为空)或@NotEmpty(我的字段为“”)字段进行验证。

【问题讨论】:

  • getter 和 setter 是公开的吗?
  • 错误信息似乎与您的代码无关。发布重现问题的真实代码,以及真实完整的异常堆栈跟踪。
  • 我使用 lombok @Data 并且在 *.class 文件中我看到了 getter 和 setter
  • 我会说问题不在于验证,而在于您的 HTML 中的路径不正确。看起来您在路径中的某处使用了properties[1]。请贴出你使用的JSP
  • 我使用 jackson objectMapper 从 json 获取对象。反序列化后,我得到正常的 java 对象,并且某些字段具有空值。使用@NotNull (codeName) 注释的空值字段。我调用 SmartValidator.validate 然后我得到异常。我验证了完全有效的 java 对象,SmartValidator.validate 必须从 codeName 字段创建 FieldError,但它抛出异常

标签: java spring bean-validation


【解决方案1】:

解决方法:去掉spring 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 是否存在验证错误

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-08-15
    • 2013-11-23
    • 2013-12-27
    • 2011-07-24
    • 1970-01-01
    • 1970-01-01
    • 2012-11-24
    • 2011-05-10
    相关资源
    最近更新 更多