gpt4 book ai didi

java - Hibernate Validator 方法或构造函数验证

转载 作者:行者123 更新时间:2023-11-30 02:32:43 25 4
gpt4 key购买 nike

如何使用 Hibernate validator 来验证构造函数或方法内的参数?我希望在创建 ValueObject 之前进行验证,这样我就可以抛出异常并且不会创建对象,除非所有参数都有效。

基本上,如果可能的话,我尝试使用注释而不是这样做:

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;
}
}

我尝试遵循docs像这样似乎可以工作,但仍然会导致创建对象。

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);
}
}

validator :

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;
}
}

最佳答案

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

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

@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;
}
}

然后在你的 build.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)
}

关于java - Hibernate Validator 方法或构造函数验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43859895/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com