Bean Validation жөнүндө кыскача маалымат
Spring Framework Java Bean Validation API колдойт.
Bean Validation жарандыкты текшерүү үчүн жалпы ыкманы камсыз кылат, Java колдонмолору үчүн чектөөлөр жана метадатарды жарыялоо аркылуу. Аны колдонуу үчүн, сен модельдин мүлктөрүнө декларативдик чектөөлөрдү аннотациялайсың. Булар андан ары аткаруу чөйрөсүндө колдонулат. Толук чектөөлөр бар, бирок сен өз чектөөлөрүңдү да аныктасаң болот.
Келгиле, PersonForm
жөнөкөй моделин карап көрөлү:
public class PersonForm {
private String name;
private int age;
}
class PersonForm(
private val name: String,
private val age: Int
)
Bean Validation чектөөлөрдү жарыялоого мүмкүндүк берет, мисалы, төмөнкүдөй:
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
)
Ошондо 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
колдоно аласың, мисалы:
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"/>
Мурунку мисалдагы базалык конфигурация текшерүү механизмин ташып келүүнү баштайт. Bean Validation жеткирүүчү, мындайча айтканда, Hibernate Validator, класстарда болушу керек жана автоматтык түрдө аныкталышы керек.
Validatorди интеграциялоо
LocalValidatorFactoryBean
javax.validation.ValidatorFactory
жана javax.validation.Validator
, жана org.springframework.validation.Validator
Spring дан ишке ашырат. Сен текшерүү логикасын чакырышы керек болгон биндерге бул интерфейстердин каалаганын киргизе аласың.
Эгерде сен түз Bean Validation API менен иштөөнү кааласаң, сен javax.validation.Validator
шилтемесин киргизе аласың, төмөнкүдөй көрсетүлгөндөй:
import javax.validation.Validator;
@Service
public class MyService {
@Autowired
private Validator validator;
}
import javax.validation.Validator;
@Service
class MyService(@Autowired private val validator: Validator)
Эгерде бин Spring Validation API талап кылса, org.springframework.validation.Validator
шилтемесин киргизе аласың, төмөнкүдөй:
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)
Өзгөчө чектөөлөрдү конфигурациялоо
Ар бир Bean Validation чектөөсү эки бөлүктөн турат:
-
@Constraint
аннотациясы, чектөөнү жана анын өзгөрүлмө касиеттерин жарыялайт. -
Интерфейсти ишке ашыруу
javax.validation.ConstraintValidator
, чектөөнүн логикасын аткарат.
Жарыялануу жана ишке ашыруу ортосундагы байланышты түзүү үчүн, ар бир @Constraint
аннотациясы тиешелүү ишке ашыруу классына ConstraintValidator
шилтеме берет. Ишке ашырылып жатканда, ConstraintValidatorFactory
жаратылуучу сунуучу ишке ашыруунун экземплярын жаратууда жалган чектөөнүн аннотациясы сенин модель туюмдарыңда кездешет.
Стандарттык түрдө LocalValidatorFactoryBean
SpringConstraintValidatorFactory
менен конфигурациялайт, бул Spring аркылуу ConstraintValidator
экземплярын жаратууга мүмкүндүк берет. Бул өзгөчө ConstraintValidators
менен Spring биндери сыяктуу көз карандычылыкты инъекциялоого мүмкүндүк берет.
Кийинки мисалда @Constraint
атайын жарыялоо көрсөтүлгөн, андан соң ConstraintValidator
ишке ашыруу Spring менен көз карандычылыктардын инъекциясы колдонулган:
@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 {
// ...
}
Мурунку мисалда көрсөтүлгөндөй, ConstraintValidator
ишке ашыруу аннотациялуу @Autowired
көз карандычылыктарды ала алат, анткени ал Spring биндери сыяктуу.
Spring менен башкарылган методдордун текшерүүсү
Сен Bean Validation 1.1 тарабынан колдоого алынган методдордун текшерүүсүн (ошондой эле Hibernate Validator 4.3 үчүн атайын кеңейтүү катары) Spring контекстине MethodValidationPostProcessor
бин аныктамасы аркылуу кыстара аласың:
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 менен башкарылган методдорду текшерүү үчүн бардык максаттуу класстар Spring тарабынан @Validated
аннотациясы менен аннотациялануусу керек, анда үстүртүнөн колдонуу үчүн топторду текшерүүнү жарыялай алышат. MethodValidationPostProcessor
боюнча кошумча маалымат алуу үчүн настройка жөнүндө кеңири маалымат ала аласыз.
Методдорду текшерүү аркылуу AOP-прокси колдонулат, максаттуу классты айланып өтүү үчүн. Бул JDK динамикалык проксилери интерфейстердеги методдор үчүн же CGLIB проксилери үчүн колдонулат. Прокси колдонууда айрым чектөөлөр бар. Ошондой эле, проксиленген класстар үчүн, ар дайым методдор жана акцессорлор колдонулууга тийиш; түз мурастарга жетүү иштебейт.
Кошумча конфигурация параметрлери
Стандарттык түрдө LocalValidatorFactoryBean
конфигурациясы көпчүлүк учурларда жетиштүү. Bean Validation үчүн ар кандай конструкцияларды конфигурациялоодо бир катар параметрлер бар, билдирүүлөрдү интерполяциялоодон баштап байкоо чечимине чейин. LocalValidatorFactoryBean
боюнча бул параметрлер жөнүндө кошумча маалымат алуу үчүн javadoc караңыз.
DataBinder
конфигурациялоо
Spring 3 менен баштап, сен Validator
менен DataBinder
экземплярын конфигурациялай аласың. Конфигурациялангандан кийин, Validator
чакырууга болот, binder.validate()
аркылуу. Текшерүү Errors
автоматтык түрдө BindingResult
менен байланыш орунга кошулат.
Төмөнкү мисалда программалануу менен DataBinder
колдонуп, максаттуу объектке байланып, текшерүү логикасын чакырууга көрсөтүлгөн:
Foo target = new Foo();
DataBinder binder = new DataBinder(target);
binder.setValidator(new FooValidator());
// объектке байланып
binder.bind(propertyValues);
// текшерүү жүргүзүлөт
binder.validate();
// BindingResult натыйжасын алуу, бардык текшерүү каталарын камтыйт
BindingResult results = binder.getBindingResult();
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
менен бириктирилген учурларда мааниге ээ.
GO TO FULL VERSION