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

Hibernate验证器方法或构造函数验证

越欣怡
2023-03-14
public class ConditionalPerson {
    private String name;
    private String surname;
    private int age;

    public ConditionalPerson(String name, String surname, int age){
        if (name == null || surname == null || age < 1) {
            throw new IllegalArgumentException();
        }
        this.name = name;
        this.surname = surname;
        this.age = age;
    }
}
public class Person {
    @NotNull(message = "Name can't be null")
    @NotEmpty(message = "Name can't be empty")
    @Length(min=1)
    private String name;

    @NotNull(message = "Surname can't be null")
    @NotEmpty(message = "Surname can't be empty")
    @Length(min=1)
    private String surname;

    @Range(min=100, max=200)
    private int age;

    public Person(String name, String surname, int age){
        this.name = name;
        this.surname = surname;
        this.age = age;
    }
}
public Person(@NotNull String name, 
              @NotNull String surname, 
              @Range(min=100, max=200) int age) { 
    ...
}
public class Example {
    Person person;
    ConditionalPerson person2;

    public static void main(String[] args) {
        Example example = new Example();
        example.makePerson();
        example.makeConditionalPerson();
    }

    public void makePerson() {
        person = new Person(null, "", 12);
        Validator validator = ValidatorSingleton.getValidator();

        Set<ConstraintViolation<Person>> violations = validator.validate(person);

        if (violations.size() > 0) {
            throw new IllegalArgumentException();
        }
    }

    public void makeConditionalPerson() {
        person2 = new ConditionalPerson(null, "", 123);
    }
}

验证器:

public class ValidatorSingleton {
    private static final ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
    private static final javax.validation.Validator validator = factory.getValidator();

    private ValidatorSingleton(){}

    public static Validator getValidator() {
        return validator;
    }
}

共有1个答案

关冠宇
2023-03-14

其他找到这篇文章的人。我稍微改变了一下我的方法,并使用OVal Validation&AspectJ而不是Hibernate来工作。

基本上与上面的示例相同,只是我需要在类上方添加@guards:

@Guarded
public class Person {
    private String name;
    private String surname;
    private int age;

    public Person(@NotNull String name, @NotNull String surname, @Range(min=100, max=200) int age){
        this.name = name;
        this.surname = surname;
        this.age = age;
    }
}

然后在你的构建中。Gradle添加:

buildscript {
    repositories {
        jcenter()
        mavenCentral()
    }
    dependencies {
        classpath 'org.aspectj:aspectjtools:1.8.10'
    }
}
dependencies {
    compile 'org.aspectj:aspectjrt:1.8.1'
    compile 'net.sf.oval:oval:1.86'
}

tasks.withType(JavaCompile) {
    doLast {
        String[] args = ["-showWeaveInfo",
                         "-1.8",
                         "-inpath", destinationDir.toString(),
                         "-aspectpath", classpath.asPath,
                         "-d", destinationDir.toString(),
                         "-classpath", classpath.asPath]

        MessageHandler handler = new MessageHandler(true);
        new Main().run(args, handler)
    }
 类似资料:
  • 问题内容: 如何使用Hibernate验证程序来验证构造函数或方法中的参数?我希望在ValueObject创建之前进行验证,因此除非所有参数都有效,否则我可以引发异常而不创建对象。 基本上,我正在尝试使用注释,而不是尽可能执行以下操作: 我试过遵循这样的文档,虽然看起来似乎有效,但仍然会导致创建对象。 将注释添加到构造函数参数似乎无效 我如何创建对象: 验证器: 问题答案: 对于找到此帖子的其他任

  • 我无法仅使用注释运行构造函数参数验证。 我的代码: 我希望当我做一些服务时 我得到了ConstraintViolationException,因为@NotNull,但这不起作用。 当我手动触发验证时,我唯一能让它工作的变体如下: 但这并不合适。 我试图创建TestConstructorLevel类作为Spring bean,但没有任何改变。 所以我的问题是:我需要使用什么注释来触发构造函数的验证。

  • 我试图使用Oval1.84来绕过一些没有样板的验证约束。当我用@NotNull(javax.validation.constraint和net.sf.oval.validator)标记字段时,验证就可以工作了。 但在对方法和构造函数参数实现constarints的情况下不起作用。

  • 问题内容: 通常,类构造函数应接受的最大参数数量是多少?我正在开发一个需要大量初始化数据(当前有10个参数)的类。但是,带有10个参数的构造函数感觉不正确。这使我相信我应该为每个数据创建一个getter / setter。不幸的是,getter / setter模式不会强迫用户输入数据,没有它,对象的表征就不完整,因此毫无用处。有什么想法吗? 问题答案: 有那么多参数,该考虑构建器模式了。创建一个

  • 我有以下课程: 我想写一个单元测试,它会检查 调用会导致调用私有方法2次,并且 调用会导致调用一次私有方法。 我知道在Mockito/PowerMockito中使用间谍对象来计算私有方法调用的数量是可能的,但是AFAIK这些方法只有在测试类构建后调用所讨论的方法时才有效。 有没有可能在不改变的构造函数的情况下编写上面描述的单元测试?

  • 我有一个接口,它在两个地方定义如下: 我的客户端实现类没有任何注释,只有必需的构造函数。在这种情况下,如何限定正确的接口实现用法?我不想使用,因为在我的例子中,将其中一个用法命名为primary在语义上是不正确的(它们在某种意义上是相等的)。我需要用相同的实现类传递相同的接口,但针对受尊敬的客户机的特定用例进行了不同的配置。我想命名一个参数就足够了,通过这个参数我将实现注入到bean创建方法中,但