Java Bean Validation

All lectures for KY purposes
Деңгээл , Сабак
жеткиликтүү

Bean Validation жөнүндө кыскача маалымат

Spring Framework Java Bean Validation API колдойт.

Bean Validation жарандыкты текшерүү үчүн жалпы ыкманы камсыз кылат, Java колдонмолору үчүн чектөөлөр жана метадатарды жарыялоо аркылуу. Аны колдонуу үчүн, сен модельдин мүлктөрүнө декларативдик чектөөлөрдү аннотациялайсың. Булар андан ары аткаруу чөйрөсүндө колдонулат. Толук чектөөлөр бар, бирок сен өз чектөөлөрүңдү да аныктасаң болот.

Келгиле, PersonForm жөнөкөй моделин карап көрөлү:

Java
public class PersonForm {
    private String name;
    private int age;
}
Kotlin
class PersonForm(
        private val name: String,
        private val age: Int
)

Bean Validation чектөөлөрдү жарыялоого мүмкүндүк берет, мисалы, төмөнкүдөй:

Java
public class PersonForm {
    @NotNull
    @Size(max=64)
    private String name;
    @Min(0)
    private int age;
}
Kotlin
class PersonForm(
    @get:NotNull @get:Size(max=64)
    private val name: String,
    @get:Min(0)
    private val age: Int
)

Ошондо Bean Validation текшергичи ушул класстын экземплярларын жарыяланган чектөөлөргө негизделип текшерет. Бул API жөнүндө жалпы маалымат алуу үчүн "Bean Validation" бөлүмүн карагыла. Конкреттүү чектөөлөр боюнча маалымат алуу үчүн Hibernate Validator документтерин карагыла. Spring бини катары Bean Validation чек текшергичин кантип конфигурациялоо керектигин билүү үчүн андан ары окуй бергиле.

Bean Validation жеткирүүчүнү конфигурациялоо

Spring Bean Validation API үчүн толук колдоону камсыз кылат, анын ичинде Bean Validation жеткирүүчүнү Spring бин катары жүктөөнү баштоо. Бул javax.validation.ValidatorFactory же javax.validation.Validator каалаган жерге тиркемедеги текшерүү үчүн интеграциялоого мүмкүндүк берет.

Сен локалдуу validatorди Spring бин катары орнотуу үчүн LocalValidatorFactoryBean колдоно аласың, мисалы:

Java
import org.springframework.validation.beanvalidation.LocalValidatorFactoryBean;
@Configuration
public class AppConfig {
    @Bean
    public LocalValidatorFactoryBean validator() {
        return new LocalValidatorFactoryBean();
    }
}
XML
<bean id="validator"
    class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean"/>

Мурунку мисалдагы базалык конфигурация текшерүү механизмин ташып келүүнү баштайт. Bean Validation жеткирүүчү, мындайча айтканда, Hibernate Validator, класстарда болушу керек жана автоматтык түрдө аныкталышы керек.

Validatorди интеграциялоо

LocalValidatorFactoryBean javax.validation.ValidatorFactory жана javax.validation.Validator, жана org.springframework.validation.Validator Spring дан ишке ашырат. Сен текшерүү логикасын чакырышы керек болгон биндерге бул интерфейстердин каалаганын киргизе аласың.

Эгерде сен түз Bean Validation API менен иштөөнү кааласаң, сен javax.validation.Validator шилтемесин киргизе аласың, төмөнкүдөй көрсетүлгөндөй:

Java
import javax.validation.Validator;
@Service
public class MyService {
    @Autowired
    private Validator validator;
}
Kotlin
import javax.validation.Validator;
@Service
class MyService(@Autowired private val validator: Validator)

Эгерде бин Spring Validation API талап кылса, org.springframework.validation.Validator шилтемесин киргизе аласың, төмөнкүдөй:

Java
import org.springframework.validation.Validator;
@Service
public class MyService {
    @Autowired
    private Validator validator;
}
Kotlin
import org.springframework.validation.Validator
@Service
class MyService(@Autowired private val validator: Validator)

Өзгөчө чектөөлөрдү конфигурациялоо

Ар бир Bean Validation чектөөсү эки бөлүктөн турат:

  • @Constraint аннотациясы, чектөөнү жана анын өзгөрүлмө касиеттерин жарыялайт.

  • Интерфейсти ишке ашыруу javax.validation.ConstraintValidator, чектөөнүн логикасын аткарат.

Жарыялануу жана ишке ашыруу ортосундагы байланышты түзүү үчүн, ар бир @Constraint аннотациясы тиешелүү ишке ашыруу классына ConstraintValidator шилтеме берет. Ишке ашырылып жатканда, ConstraintValidatorFactory жаратылуучу сунуучу ишке ашыруунун экземплярын жаратууда жалган чектөөнүн аннотациясы сенин модель туюмдарыңда кездешет.

Стандарттык түрдө LocalValidatorFactoryBean SpringConstraintValidatorFactory менен конфигурациялайт, бул Spring аркылуу ConstraintValidator экземплярын жаратууга мүмкүндүк берет. Бул өзгөчө ConstraintValidators менен Spring биндери сыяктуу көз карандычылыкты инъекциялоого мүмкүндүк берет.

Кийинки мисалда @Constraint атайын жарыялоо көрсөтүлгөн, андан соң ConstraintValidator ишке ашыруу Spring менен көз карандычылыктардын инъекциясы колдонулган:

Java
@Target({ElementType.METHOD, ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy=MyConstraintValidator.class)
public @interface MyConstraint {
}
Kotlin
@Target(AnnotationTarget.FUNCTION, AnnotationTarget.FIELD)
@Retention(AnnotationRetention.RUNTIME)
@Constraint(validatedBy = MyConstraintValidator::class)
annotation class MyConstraint
Java
import javax.validation.ConstraintValidator;
public class MyConstraintValidator implements ConstraintValidator {
    @Autowired;
    private Foo aDependency;
    // ...
}
Kotlin
import javax.validation.ConstraintValidator
class MyConstraintValidator(private val aDependency: Foo) : ConstraintValidator {
    // ...
}

Мурунку мисалда көрсөтүлгөндөй, ConstraintValidator ишке ашыруу аннотациялуу @Autowired көз карандычылыктарды ала алат, анткени ал Spring биндери сыяктуу.

Spring менен башкарылган методдордун текшерүүсү

Сен Bean Validation 1.1 тарабынан колдоого алынган методдордун текшерүүсүн (ошондой эле Hibernate Validator 4.3 үчүн атайын кеңейтүү катары) Spring контекстине MethodValidationPostProcessor бин аныктамасы аркылуу кыстара аласың:

Java
import org.springframework.validation.beanvalidation.MethodValidationPostProcessor;
@Configuration
public class AppConfig {
    @Bean
    public MethodValidationPostProcessor validationPostProcessor() {
        return new MethodValidationPostProcessor();
    }
}
XML
<bean class="org.springframework.validation.beanvalidation.MethodValidationPostProcessor"/>

Spring менен башкарылган методдорду текшерүү үчүн бардык максаттуу класстар Spring тарабынан @Validated аннотациясы менен аннотациялануусу керек, анда үстүртүнөн колдонуу үчүн топторду текшерүүнү жарыялай алышат. MethodValidationPostProcessor боюнча кошумча маалымат алуу үчүн настройка жөнүндө кеңири маалымат ала аласыз.

Методдорду текшерүү аркылуу AOP-прокси колдонулат, максаттуу классты айланып өтүү үчүн. Бул JDK динамикалык проксилери интерфейстердеги методдор үчүн же CGLIB проксилери үчүн колдонулат. Прокси колдонууда айрым чектөөлөр бар. Ошондой эле, проксиленген класстар үчүн, ар дайым методдор жана акцессорлор колдонулууга тийиш; түз мурастарга жетүү иштебейт.

Кошумча конфигурация параметрлери

Стандарттык түрдө LocalValidatorFactoryBean конфигурациясы көпчүлүк учурларда жетиштүү. Bean Validation үчүн ар кандай конструкцияларды конфигурациялоодо бир катар параметрлер бар, билдирүүлөрдү интерполяциялоодон баштап байкоо чечимине чейин. LocalValidatorFactoryBean боюнча бул параметрлер жөнүндө кошумча маалымат алуу үчүн javadoc караңыз.

DataBinder конфигурациялоо

Spring 3 менен баштап, сен Validator менен DataBinder экземплярын конфигурациялай аласың. Конфигурациялангандан кийин, Validator чакырууга болот, binder.validate() аркылуу. Текшерүү Errors автоматтык түрдө BindingResult менен байланыш орунга кошулат.

Төмөнкү мисалда программалануу менен DataBinder колдонуп, максаттуу объектке байланып, текшерүү логикасын чакырууга көрсөтүлгөн:

Java
Foo target = new Foo();
DataBinder binder = new DataBinder(target);
binder.setValidator(new FooValidator());
// объектке байланып
binder.bind(propertyValues);
// текшерүү жүргүзүлөт
binder.validate();
// BindingResult натыйжасын алуу, бардык текшерүү каталарын камтыйт
BindingResult results = binder.getBindingResult();
Kotlin
val target = Foo()
val binder = DataBinder(target)
binder.validator = FooValidator()
// объектке байланып
binder.bind(propertyValues)
// текшерүү жүргүзүлөт
binder.validate()
// BindingResult натыйжасын алуу, бардык текшерүү каталарын камтыйт
val results = binder.bindingResult

Ошондой эле DataBinder бир нече Validator экземплярлары менен dataBinder.addValidators жана dataBinder.replaceValidators аркылуу конфигурацияланышы мүмкүн. Бул глобалдык түрдө конфигурацияланган биндердин текшерүү зарылдыктары локалдуу деңгээлде түзүлгөн Validator менен бириктирилген учурларда мааниге ээ.

Комментарийлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION