[英]Hibernate validation - only validate if object is not null
我想驗證myClass
變量。 問題在於myClass
可以為null或對myClass對象的引用 。 如果它是一個引用,我希望它驗證對象,如果它為null,則顯然不應進行驗證。
以下有效,但myClass 不能為null。
public class ParentClass {
@Valid
@NotNull
private MyClass myClass;
}
public MyClass {
@Pattern(regexp="\\d.{10}")
private String myField;
}
如果我從ParentClass
刪除@NotNull
批注,即使我保留@Valid
批注,它也不再執行驗證。
public class ParentClass {
@Valid
private MyClass myClass;
}
public MyClass {
@Pattern(regexp="\\d.{10}") //this validation never takes place
private String myField;
}
是否可以使用jpa / hibernate批注驗證可選的null字段?
當您說this validation never takes place
,您是在指myField為null或填充(或填充)的情況嗎?
因為我還在一個項目上使用了Validator,所以我進行了一些測試,當myField為null時,它將不被驗證。 如果不為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>
這是測試代碼:
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());
}
}
我希望這有幫助。 在我看來,所顯示的行為是正確的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.