Saya menggunakan validasi JPA 2.0 / Hibernate untuk memvalidasi model saya. Saya sekarang memiliki situasi di mana kombinasi dua bidang harus divalidasi:
public class MyModel {
public Integer getValue1() {
//...
}
public String getValue2() {
//...
}
}
Model ini tidak valid jika kedua getValue1()
dan getValue2()
yang null
dan berlaku sebaliknya.
Bagaimana saya bisa melakukan validasi semacam ini dengan JPA 2.0 / Hibernate? Dengan @NotNull
anotasi sederhana, kedua pengambil harus bukan null untuk lolos validasi.
java
jpa
jpa-2.0
bean-validation
Daniel Rikowski
sumber
sumber
Jawaban:
Untuk validasi beberapa properti, Anda harus menggunakan batasan tingkat kelas. Dari Validasi Bean Sneak Peek bagian II: batasan khusus :
sumber
TYPE
danRUNTIME
harus diganti denganElementType.TYPE
danRetentionPolicy.RUNTIME
, masing-masing.import static java.lang.annotation.ElementType.*;
danimport static java.lang.annotation.RetentionPolicy.*;
Untuk bekerja dengan baik dengan Validasi Bean , contoh yang diberikan dalam jawaban Pascal Thivent dapat ditulis ulang sebagai berikut:
@ValidAddress public class Address { @NotNull @Size(max = 50) private String street1; @Size(max = 50) private String street2; @NotNull @Size(max = 10) private String zipCode; @NotNull @Size(max = 20) private String city; @Valid @NotNull private Country country; // Getters and setters }
public class Country { @NotNull @Size(min = 2, max = 2) private String iso2; // Getters and setters }
@Documented @Target(TYPE) @Retention(RUNTIME) @Constraint(validatedBy = { MultiCountryAddressValidator.class }) public @interface ValidAddress { String message() default "{com.example.validation.ValidAddress.message}"; Class<?>[] groups() default {}; Class<? extends Payload>[] payload() default {}; }
public class MultiCountryAddressValidator implements ConstraintValidator<ValidAddress, Address> { public void initialize(ValidAddress constraintAnnotation) { } @Override public boolean isValid(Address address, ConstraintValidatorContext constraintValidatorContext) { Country country = address.getCountry(); if (country == null || country.getIso2() == null || address.getZipCode() == null) { return true; } switch (country.getIso2()) { case "FR": return // Check if address.getZipCode() is valid for France case "GR": return // Check if address.getZipCode() is valid for Greece default: return true; } } }
sumber
isoA2Code
disimpan dalamCountry
tabel DB . Apakah ini ide yang bagus untuk menelepon DB dari sini? Juga, saya ingin menautkan mereka setelah validasi karenaAddress
belongs_to
aCountry
dan saya inginaddress
entri memilikicountry
kunci asing tabel. Bagaimana saya menghubungkan negara ke alamat?@ValidAddress
anotasi di objek Negara, Anda akan mendapatkanNo validator could be found for constraint 'com.example.validation.ValidAddress' validating type 'com.example.Country'
pengecualian.Sebuah validator tingkat kelas kustom adalah cara untuk pergi, ketika Anda ingin tetap dengan spesifikasi Validasi Bean, misalnya sini .
Jika Anda senang menggunakan fitur Hibernate Validator, Anda dapat menggunakan @ScriptAssert , yang disediakan sejak Validator-4.1.0.Final. Kecuali dari JavaDoc-nya:
Contoh:
@ScriptAssert(lang = "javascript", script = "_this.value1 != null || _this != value2)") public class MyBean { private String value1; private String value2; }
sumber