如何使用Hibernate验证程序来验证构造函数或方法中的参数?我希望在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;
}
}
我试过遵循这样的文档,虽然看起来似乎有效,但仍然会导致创建对象。
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;
}
}
对于找到此帖子的其他任何人。我略微改变了方法,并使用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中设置变量值的方法。有时使用带有参数的构造函数,而其他setter方法则用于设置每个变量的值。 我知道,一旦使用“新”关键字实例化了一个类,构造函数就会在类内部初始化一个实例变量。 但是,什么时候使用构造函数,何时使用setter? 问题答案: 当您要创建对象的新实例时,应使用构造函数方法,该实例的值已填充(准备使用的对象中已填充值)。这样,您无需
问题内容: 通常,类构造函数应接受的最大参数数量是多少?我正在开发一个需要大量初始化数据(当前有10个参数)的类。但是,带有10个参数的构造函数感觉不正确。这使我相信我应该为每个数据创建一个getter / setter。不幸的是,getter / setter模式不会强迫用户输入数据,没有它,对象的表征就不完整,因此毫无用处。有什么想法吗? 问题答案: 有那么多参数,该考虑构建器模式了。创建一个
我无法仅使用注释运行构造函数参数验证。 我的代码: 我希望当我做一些服务时 我得到了ConstraintViolationException,因为@NotNull,但这不起作用。 当我手动触发验证时,我唯一能让它工作的变体如下: 但这并不合适。 我试图创建TestConstructorLevel类作为Spring bean,但没有任何改变。 所以我的问题是:我需要使用什么注释来触发构造函数的验证。
Kotlin中的参数与Java中有些不同。如你所见,我们先写参数的名字再写它的类型: fun add(x: Int, y: Int) : Int { return x + y } 我们可以给参数指定一个默认值使得它们变得可选,这是非常有帮助的。这里有一个例子,在Activity中创建了一个函数用来toast一段信息: fun toast(message: String, length: I
setMnemonic(int)是构造函数还是方法? http://docs.oracle.com/javase/tutorial/uiswing/components/menu.html