Bean Validation haqida qisqacha
Spring Framework Java Bean Validation API-interfeysini qo'llab-quvvatlashni ta'minlaydi.
Bean Validation Java ilovalari uchun cheklovlar va metadata e'lon qilish orqali umumiy tekshirish usulini ta'minlaydi. Uning ishlatilishi uchun siz model mulklarini deklarativ cheklovlar bilan annotatsiya qilasiz, bu cheklovlar keyinchalik ish vaqti muhitida qo'llaniladi. Ichki cheklovlar mavjud, lekin siz o'zingizning cheklovlaringizni ham aniqlashingiz mumkin.
Quyidagi misolni ko'rib chiqamiz, unda ikki xususiyatga ega oddiy PersonForm modeli ko'rsatilgan:
public class PersonForm {
private String name;
private int age;
}
class PersonForm(
private val name: String,
private val age: Int
)
Bean Validation cheklovlar e'lon qilishga imkon beradi, bu quyidagi misolda ko'rsatilgan:
public class PersonForm {
@NotNull
@Size(max=64)
private String name;
@Min(0)
private int age;
}
class PersonForm(
@get:NotNull @get:Size(max=64)
private val name: String,
@get:Min(0)
private val age: Int
)
Keyin Bean Validation validator bu sinfning nusxalarini e'lon qilingan cheklovlar asosida tekshiradi. Ushbu API-interfeys haqidagi umumiy ma'lumotni "Bean Validation" bo'limida ko'ring. Aniq cheklovlar uchun Hibernate Validator hujjatlarida qarang. Beanlar tekshirish provayderini Spring bean sifatida qanday sozlashni bilish uchun o'qishni davom ettiring.
Bean Validation provayderini sozlash
Spring Bean Validation API'ni to'liq qo'llab-quvvatlaydi, jumladan, Bean Validation provayderini Spring bean sifatida yuklashni. Bu ilovada tekshirish mavhum bo'lgan joyda javax.validation.ValidatorFactory yoki javax.validation.Validator ni in'ektsiya qilish imkonini beradi.
Siz LocalValidatorFactoryBean dan foydalanib, validatorni Spring bean sifatida sukut bo'yicha sozlashingiz mumkin, bu quyidagi misolda ko'rsatilgan:
import org.springframework.validation.beanvalidation.LocalValidatorFactoryBean;
@Configuration
public class AppConfig {
@Bean
public LocalValidatorFactoryBean validator() {
return new LocalValidatorFactoryBean();
}
}
<bean id="validator"
class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean"/>
Yuqoridagi misoldagi asosiy konfiguratsiya bean tekshirishni sukut bo'yicha yuklash mexanizmidan foydalanib ishga tushiradi. Hibernate Validator kabi Bean Validation provayderi classpathda bo'lishi va avtomatik aniqlanishi kerak.
Validatorni in'ektsiya qilish
LocalValidatorFactoryBean javax.validation.ValidatorFactory va javax.validation.Validator dan tashqari Spring'dan org.springframework.validation.Validator sifatida ham ishlaydi. Siz tekshirish mantiqini chaqirishi kerak bo'lgan beanlarga ushbu interfeyslar har qandayiga bog'lamani in'ektsiya qilishingiz mumkin.
To‘g‘ridan-to‘g‘ri Bean Validation API bilan ishlashni afzal ko‘rsangiz, quyidagi misolda ko‘rsatilganidek, javax.validation.Validator ga bog‘lamani in'ektsiya qilishingiz mumkin:
import javax.validation.Validator;
@Service
public class MyService {
@Autowired
private Validator validator;
}
import javax.validation.Validator;
@Service
class MyService(@Autowired private val validator: Validator)
Agar bean Spring Validation API'sini talab qilsa, quyidagi misolda ko‘rsatilganidek, org.springframework.validation.Validator ga bog'lamani in'ektsiya qilish mumkin:
import org.springframework.validation.Validator;
@Service
public class MyService {
@Autowired
private Validator validator;
}
import org.springframework.validation.Validator
@Service
class MyService(@Autowired private val validator: Validator)
Maxsus cheklovlarni sozlash
Har bir bean tekshirish cheklovi ikki qismdan iborat:
-
@Constraintannotatsiyasi, cheklovni va uning moslashtirilgan xususiyatlarini e'lon qilish. -
javax.validation.ConstraintValidatorinterfeysining amalga oshirilishi, cheklov harakat mantiqini amalga oshiradigan.
E'lonni amalga oshirish bilan bog'lash uchun, har bir @Constraint annotatsiyasi mos ConstraintValidator amalga oshirish sinfini ko'rsatadi. Ish vaqtida ConstraintValidatorFactory amalga oshiruvchi sinfning nusxasini yaratadi, agar cheklov annotatsiyasi sizning ma'lumot modeliingizda topilgan bo'lsa.
Sukut bo'yicha LocalValidatorFactoryBean SpringConstraintValidatorFactory ni sozlaydi, bu ConstraintValidator nusxalarini yaratish uchun Spring-dan foydalangan. Bu maxsus ConstraintValidators ning Springdagi boshqa beanlar kabi bog'lanma in'ektsiyasidan foydalanish imkonini beradi.
Quyidagi misol maxsus @Constraint e'loni, keyin Springdan foydalanib bog'lanma in'ektsiyasidan foydalanadigan ConstraintValidator amalini ko'rsatadi:
@Target({ElementType.METHOD, ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy=MyConstraintValidator.class)
public @interface MyConstraint {
}
@Target(AnnotationTarget.FUNCTION, AnnotationTarget.FIELD)
@Retention(AnnotationRetention.RUNTIME)
@Constraint(validatedBy = MyConstraintValidator::class)
annotation class MyConstraint
import javax.validation.ConstraintValidator;
public class MyConstraintValidator implements ConstraintValidator {
@Autowired;
private Foo aDependency;
// ...
}
import javax.validation.ConstraintValidator
class MyConstraintValidator(private val aDependency: Foo) : ConstraintValidator {
// ...
}
Yuqoridagi misoldan ko'rinib turibdiki, ConstraintValidator amalga oshirilishi o'zining @Autowired annotatsiyasi bilan belgilangan bog'lanmalarga ega bo'lishi mumkin, xuddi Springdagi boshqa har qanday bean kabi.
Spring tomonidan boshqariladigan metodlar tekshiruvi
Siz Bean Validation 1.1 tomonidan qo'llab-quvvatlanadigan metodlar tekshiruvi funksiyasini Spring kontekstiga MethodValidationPostProcessor beanini aniqlash orqali kiritishingiz mumkin:
import org.springframework.validation.beanvalidation.MethodValidationPostProcessor;
@Configuration
public class AppConfig {
@Bean
public MethodValidationPostProcessor validationPostProcessor() {
return new MethodValidationPostProcessor();
}
}
<bean class="org.springframework.validation.beanvalidation.MethodValidationPostProcessor"/>
Spring tomonidan boshqariladigan metodlar tekshiruvi uchun barcha maqsad sinflarini @Validated annotatsiyasi bilan annotatsiya qilishingiz kerak, bu yerda ishtiyoq bilan foydalanish uchun tekshirish guruhlarini e'lon qilishingiz mumkin. Qo'shimcha ma'lumot uchun MethodValidationPostProcessor ga qarang.
Metodlar tekshiruvi AOP proksi yordamida maqsad sinflarini aylanib o'tadi, bu esa interfeyzlar ustidagi metodlar uchun JDK dinamik proksisi yoki CGLIB proksisini qo'llaydi. Proksidan foydalanishda ba'zi cheklovlar mavjud. Shuningdek, proksilangan sinflar uchun har doim metodlar va aktsessorlardan foydalanish kerakligini yodda tuting; to'g'ridan-to'g'ri maydonlarga kirish ishlamaydi.
Qo'shimcha konfiguratsiya parametrlari
LocalValidatorFactoryBean ning sukut bo'yicha konfiguratsiyasi ko'p hollarda yetarlidir. Bean Validationning har xil tuzilmalarini sozlash uchun, xabarlarni interpolatsiyadan tortib aylanib o'tishni hal qilishgacha, bir qator sozlash opsiyalari mavjud. Ushbu opsiyalar haqida ko'proq ma'lumot olish uchun LocalValidatorFactoryBean javadoc'iga qarang.
DataBinderni sozlash
Spring 3'dan boshlab, siz Validator yordamida DataBinder nusxasini sozlashingiz mumkin. Sozlanganidan so'ng, Validatorni binder.validate() orqali chaqirishingiz mumkin. Har qanday tekshirish Errors avtomatik ravishda BindingResult ga qo'shiladi.
Quyidagi misolda DataBinderni maqsad ob'ektga bog'langanidan so'ng tekshirish mantiqini chaqirish uchun dasturiy ravishda qanday foydalanishni ko'rsatadi:
Foo target = new Foo();
DataBinder binder = new DataBinder(target);
binder.setValidator(new FooValidator());
// maqsad ob'ektni bog'lash
binder.bind(propertyValues);
// maqsad ob'ektni tekshirish
binder.validate();
// bindingResult'ni, barcha xatoliklarni o'z ichiga olgan holda, olish
BindingResult results = binder.getBindingResult();
val target = Foo()
val binder = DataBinder(target)
binder.validator = FooValidator()
// maqsad ob'ektni bog'lash
binder.bind(propertyValues)
// maqsad ob'ektni tekshirish
binder.validate()
// bindingResult'ni, barcha xatoliklarni o'z ichiga olgan holda, olish
val results = binder.bindingResult
Shuningdek, siz dataBinder.addValidators va dataBinder.replaceValidators yordamida DataBinderni bir nechta Validator nusxalari bilan sozlashingiz mumkin. Bu jarayon jahon miqyosida sozlangan bean tekshirishni lokal ravishda DataBinder nusxasi uchun sozlangan Spring Validator bilan birlashtirganda mantiqiy bo'ladi.
GO TO FULL VERSION