当前位置: 首页 > 知识库问答 >
问题:

Spring验证JSR-303@NotNull抛出NotReadablePropertyException

谢英耀
2023-03-14
@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验证时

2018-07-06 16:04:09.769错误10223--[nio-8080-exec-1]O.a.C.C.C.[.[.[/].[dispatcherServlet]:路径为[]的上下文中servlet[dispatcherServlet]的servlet.service()引发异常[请求处理失败;嵌套异常为java.lang.IllegalStateException:JSR-303已验证的属性“Properties[1].CodeName”没有相应的Spring数据绑定的访问器-检查数据绑定器的配置(bean属性与直接字段访问)]

org.springframework.beans.NotReadablePropertyException:bean类[java.lang.String]的无效属性“properties[1]”:bean属性“properties[1]”不可读或具有无效的getter方法:getter的返回类型是否与setter的参数类型匹配?在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.释放

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

共有1个答案

乌灿
2023-03-14

解决方案:删除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));     
 类似资料:
  • 我使用Spring 3.2.2与Primeface 4.0和Hibernate 4.2。我在我的实体上有JSR303验证注释,并且我配置了Spring来在服务层验证它们——这很好。 但是我希望在调用服务之前启动JSF验证,但事实并非如此。我所做的所有研究都表明,我只需在类路径中添加一个验证程序,JSF2就会自动应用。 我已将建议的JAR添加到我的类路径中: 完整的依赖关系树可以在https://g

  • 我目前正在用Spring开发一个应用程序,使用Hibernate作为ORM。我知道,默认情况下,Hibernate在持久化或加载实体时都会使用JSR-303 Bean验证。由于此应用程序支持草稿(我希望在持久化后执行验证),因此必须将其添加到persistence.xml中: 模型实体代码: 我想知道如何传播bean验证,以便每当MyEntity实例被验证时,所有相关联的bar也被验证,而不必在验

  • 我的bean中有两个字段 当字段key=“A”,“value”应该跟在其他“key”的特定Regex后面时,它可以是任何内容。 如何根据键定义此值验证。

  • 我正在使用JSF2(MyFaces2.2.9)和Bean验证(Hibernate Validator5.2.2.final)。 我在一个bean上使用@NotNull注释,它是我的托管bean的一个属性。 (ManagedBean类) (Bean类) 预先感谢您的回答。 注意:我真的希望坚持只由JSR303完成的验证,因为这样我就有了一种处理约束的统一方法。所以没有JSF验证器(我知道它可以做同样

  • 我们有一个带有JSR注释的简单bean 我们有一个Spring控制器 我们的问题是,当调用changePassword时,验证器忽略组(PasswordChange.Class)并只验证组中不存在的firstName和lastName。 知道吗?非常感谢你抽出时间。

  • scala支持JSR-303验证吗? 如果是的话,你能写一个例子吗? 如果没有-是否有变通方法在scala类上运行JSR-303验证?