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

配置Hibernate验证器不使用hashCode()

潘鸿文
2023-03-14
@Getter
@Setter
@ToString
public class UserRequest {

    @NotNull
    @Size(max = 50)
    private String name;

    @Valid
    private AddressRequest address;

}


@Getter
@Setter
@ToString
public class AddressRequest {

    @Size(max = 50)
    private String street;

    @Size(max = 50)
    private String postcode;

    @NotNull
    private String country;

    @Override
    public boolean equals(Object o) {
        if (this == o) {
            return true;
        }
        if (o == null || getClass() != o.getClass()) {
            return false;
        }

        AddressRequest that = (AddressRequest) o;

        if (street != null ? !street.equals(that.street) : that.street != null) {
            return false;
        }
        if (postcode != null ? !postcode.equals(that.postcode) : that.postcode != null) {
            return false;
        }
        if (country != that.country) {
            return false;
        }
        return true;

    }

    @Override
    public int hashCode() {
        int result = street != null ? street.hashCode() : 0;
        result = 31 * result + (postcode != null ? postcode.hashCode() : 0);
        result = 31 * result + country.hashCode();
        return result;
    }
}

我使用Hibernate Validator5.2。有什么方法可以配置它来避免这种情况吗?

这是来自NPE的堆栈跟踪:

javax.validation.ValidationException: HV000041: Call to TraversableResolver.isReachable() threw an exception.
    at org.hibernate.validator.internal.engine.ValidatorImpl.isReachable(ValidatorImpl.java:1531) ~[hibernate-validator-5.2.2.Final.jar:5.2.2.Final]
    at org.hibernate.validator.internal.engine.ValidatorImpl.isValidationRequired(ValidatorImpl.java:1507) ~[hibernate-validator-5.2.2.Final.jar:5.2.2.Final]
    at org.hibernate.validator.internal.engine.ValidatorImpl.validateMetaConstraint(ValidatorImpl.java:584) ~[hibernate-validator-5.2.2.Final.jar:5.2.2.Final]
    at org.hibernate.validator.internal.engine.ValidatorImpl.validateConstraint(ValidatorImpl.java:555) ~[hibernate-validator-5.2.2.Final.jar:5.2.2.Final]
    at org.hibernate.validator.internal.engine.ValidatorImpl.validateConstraintsForDefaultGroup(ValidatorImpl.java:490) ~[hibernate-validator-5.2.2.Final.jar:5.2.2.Final]
    at org.hibernate.validator.internal.engine.ValidatorImpl.validateConstraintsForCurrentGroup(ValidatorImpl.java:454) 
    ...
    ...
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) [na:1.8.0_66]
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) [na:1.8.0_66]
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) [tomcat-embed-core-8.0.28.jar:8.0.28]
    at java.lang.Thread.run(Thread.java:745) [na:1.8.0_66]
Caused by: java.lang.NullPointerException: null
    at com.example.dto.AddressRequest.hashCode(AddressRequest.java:106) ~[classes/:na]
    at org.hibernate.validator.internal.engine.resolver.CachingTraversableResolverForSingleValidation$TraversableHolder.buildHashCode(CachingTraversableResolverForSingleValidation.java:143) ~[hibernate-validator-5.2.2.Final.jar:5.2.2.Final]
    at org.hibernate.validator.internal.engine.resolver.CachingTraversableResolverForSingleValidation$TraversableHolder.<init>(CachingTraversableResolverForSingleValidation.java:104) ~[hibernate-validator-5.2.2.Final.jar:5.2.2.Final]
    at org.hibernate.validator.internal.engine.resolver.CachingTraversableResolverForSingleValidation$TraversableHolder.<init>(CachingTraversableResolverForSingleValidation.java:86) ~[hibernate-validator-5.2.2.Final.jar:5.2.2.Final]
    at org.hibernate.validator.internal.engine.resolver.CachingTraversableResolverForSingleValidation.isReachable(CachingTraversableResolverForSingleValidation.java:31) ~[hibernate-validator-5.2.2.Final.jar:5.2.2.Final]
    at org.hibernate.validator.internal.engine.ValidatorImpl.isReachable(ValidatorImpl.java:1522) ~[hibernate-validator-5.2.2.Final.jar:5.2.2.Final]
    ... 101 common frames omitted

共有1个答案

许远航
2023-03-14

因此,此问题已作为https://hibernate.atlassian.net/browse/hv-1013的一部分得到修复。

你能把HV升级到最新的稳定,例如5.4.1.final吗?

它应该是一个临时替换(请参见这里的迁移指南:https://developer.jboss.org/wiki/HibernateValidatorMigrationGuide)。

 类似资料:
  • 问题内容: 问题已经解决了这里,但没有工作,我(不相同的弹簧引导版本我猜)本 尝试编写自定义约束验证器代码,以在保留之前检查帐户电子邮件是否存在。 // ------------------------------------------------ -------------------------- // --------------------------------------------

  • 问题已经在这里解决了,但对我不起作用(我猜不是同一个Spring启动版本) 尝试编写自定义约束验证器,在持久化之前检查帐户电子邮件是否存在。 // -------------------------------------------------------------------------- // ------------------------------------------------

  • 现在,我正在用Spring MVC开发一个web应用程序。 样品值可以是“0.05”、“1.00”、“12.55”等。 因此,如果有任何办法来解决这个问题,请点亮我。谢了。

  • 首先,我是Vaadin7的新手。当我发现BeanFieldGroup.class时,我正在尝试一些vaadin演示。正如我所看到的,这个类将一个字段绑定到一个bean属性。在bean中,使用验证约束注释对属性进行注释(JSR303)。在本例中,我的pom.xml包含hibernate验证器依赖项: 我创建了validationmessage.properties文件,并在其中放了一些消息(带有匈牙

  • 我试图用Hibernate Validation 6.0.1定义约束定义,其中验证器位于相对于约束注释的不同位置(.jar/项目)。Aka,我有我想要验证的对象,它们位于带有注释定义的项目“api”中,但我将在项目“modules/common”中有验证器 我遵循文档中的描述。 配置文件 约束注释 验证器 我的问题我的问题是,如果我没有将“@约束(validatedby={})”放在注释中,我会得

  • 我正在使用Spring Boot 2.2.0用java bean验证框架构建一个restful服务。Hibernate-Validator在幕后使用。验证工作得很好,但在一个字段与约束不匹配后会引发异常。我想先验证所有字段,然后给消费者一个包含所有错误的响应。这可能吗?