jax*_*jax 5 java hibernate jpa
我想验证myClass
变量.问题是myClass
可以是null或对myClass对象的引用.如果它是一个引用,我希望它验证对象,如果它是null,显然不应该进行验证.
以下工作但myClass 不能为null.
public class ParentClass {
@Valid
@NotNull
private MyClass myClass;
}
public MyClass {
@Pattern(regexp="\\d.{10}")
private String myField;
}
Run Code Online (Sandbox Code Playgroud)
如果我@NotNull
从中删除注释,ParentClass
即使我保留注释,也不再执行验证@Valid
.
public class ParentClass {
@Valid
private MyClass myClass;
}
public MyClass {
@Pattern(regexp="\\d.{10}") //this validation never takes place
private String myField;
}
Run Code Online (Sandbox Code Playgroud)
是否可以使用jpa/hibernate注释验证可选的空字段?
当你说this validation never takes place
你指的是myField为null或填充(或者是)的情况?
由于我在我的一个项目中也使用了Validator,我运行了一些测试,当myField为null时,它没有经过验证.当它不为null时,它就是.我使用以下版本:
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>1.1.0.Final</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>5.0.1.Final</version>
</dependency>
<dependency>
<groupId>javax.el</groupId>
<artifactId>javax.el-api</artifactId>
<version>3.0.0</version>
</dependency>
<dependency>
<groupId>org.glassfish.web</groupId>
<artifactId>javax.el</artifactId>
<version>2.2.4</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)
这是测试代码:
public class MyClass {
public MyClass() {
}
public MyClass(String myField) {
this.myField = myField;
}
@Pattern(regexp="\\d+\\D+")
private String myField;
}
public class ParentClass {
@Valid
private MyClass myClass;
public ParentClass() {
}
public ParentClass(MyClass myClass) {
this.myClass = myClass;
}
}
public class ValidatorTest {
javax.validation.Validator v;
@Before
public void setup() {
ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
v = factory.getValidator();
}
@Test
public void testValidations() {
Assert.assertEquals(0, v.validate(new ParentClass()).size()); // Null reference
Assert.assertEquals(0, v.validate(new ParentClass(new MyClass())).size()); // Valid reference, null field
Assert.assertEquals(1, v.validate(new ParentClass(new MyClass("I fail"))).size());
Assert.assertEquals(0, v.validate(new ParentClass(new MyClass("1 pass"))).size());
}
}
Run Code Online (Sandbox Code Playgroud)
我希望这有帮助.似乎(对我而言)证明的行为是正确的.