рдЬрд╛рд╡рд╛ рдореЗрдВ рд╡рд░реНрдЧ рдбреЗрдЯрд╛ (рдмреАрди) рдХреЛ рдорд╛рдиреНрдп рдХрд░рдирд╛ рдПрдХ рдирдпрд╛ рд╡рд┐рд╖рдп рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣рд╛рдВ рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рдореИрдВ рд╡рд┐рднрд┐рдиреНрди рдкрд╣рд▓реБрдУрдВ рдХреЛ рдЬреЛрдбрд╝реВрдВрдЧрд╛: рдЬреЗрдПрд╕рдЖрд░ -303 рдХреЗ рднреАрддрд░ рдбреЗрдЯрд╛ рд╕рддреНрдпрд╛рдкрди, рдореИрдВ рджрд┐рдЦрд╛рдКрдВрдЧрд╛ рдХрд┐ рдпрд╣ рд╢реБрджреНрдз рд░реВрдк рд╕реЗ рдЬрд╛рд╡рд╛ рдореЗрдВ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рд╕реНрдкреНрд░рд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдпрд╣ рдПрдХ рдорд╛рдирдХ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдореЗрдВ рдФрд░ рд╡реЗрдм рдкрд░ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рд╕рд╛рдордЧреНрд░реА: рдбреЗрдЯрд╛ рд╕рддреНрдпрд╛рдкрди (JSR-303) рдореЗрдВ
- рдорд╛рдирдХ рдЬрд╛рд╡рд╛ рдЖрд╡реЗрджрди
- рд╡рд╕рдВрдд рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛
- рдЬрд╛рд╡рд╛ + рд╕реНрдкреНрд░рд┐рдВрдЧ рдПрд╕реЛрд╕рд┐рдПрд╢рди
- рд╕реНрдкреНрд░рд┐рдВрдЧ mvc
рдПрдХ рдорд╛рдирдХ рдЬрд╛рд╡рд╛ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдореЗрдВ рдорд╛рдиреНрдпрддрд╛
рдСрдмреНрдЬреЗрдХреНрдЯ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╡рд░реНрдЧ рдХреЗ рдХреНрд╖реЗрддреНрд░реЛрдВ рдкрд░ рдПрдиреЛрдЯреЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЕрд░реНрдерд╛рддред рдШреЛрд╖рдгрд╛рддреНрдордХ рдореЙрдбрд▓ред рдПрдиреЛрдЯреЗрд╢рди рдкрд╣рд▓реЗ рд╕реЗ рддреИрдпрд╛рд░ рд╣реИрдВ:
рдЕрд╢рдХреНрдд , @DecimalMin, @Digits, рдкреИрдЯрд░реНрди , рдИрдореЗрд▓ , рдЖрджрд┐ред
, рдФрд░ рдЖрдк рднреА рдЕрдкрдирд╛ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред рдФрд░ рдЗрд╕рд▓рд┐рдП рдПрдХ рд╡рд░реНрдЧ рд╣реИ (рдмреАрди)
import javax.validation.constraints.Digits; import javax.validation.constraints.Size; public class Person { @Size(min=2, max=50) private String Name; @Digits(integer=3, fraction=0, message = " 3- ") @PersonAgeConstraint private Integer age; public Person(String name, Integer age) { Name = name; this.age = age; } }
рдпрд╣рд╛рдБ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ
рдЖрдХрд╛рд░ рдФрд░ @Digits рддреИрдпрд╛рд░ рдПрдиреЛрдЯреЗрд╢рди, рдФрд░ @PersonAgeConstraint рдХреЗ рдорд╛рд▓рд┐рдХ рд╣реИрдВред рдЕрдкрдирд╛ рдЦреБрдж рдХрд╛ рдХреИрд╕реЗ рдмрдирд╛рдПрдВ:
- рдПрдиреЛрдЯреЗрд╢рди рддреИрдпрд╛рд░ рдХрд░реЗрдВ
@Target({ElementType.METHOD, ElementType.FIELD}) @Retention(RetentionPolicy.RUNTIME) @Constraint(validatedBy=PersonAgeConstraintValidator.class) public @interface PersonAgeConstraint { String message() default "{value.negative}"; Class<?>[] groups() default {}; Class<? extends Payload>[] payload() default {}; }
рд╕рдВрджреЗрд╢ рдореЗрдВ (), рд╕рдВрджреЗрд╢ рдХреЗ рд╕рдВрд╕рд╛рдзрди рдлрд╝рд╛рдЗрд▓ (ValidationMessages.properties) рд╕реЗ рдХреБрдВрдЬреА (рдорд╛рди) рд▓рд┐рдЦреЗрдВред
value.negative = рдЛрдгрд╛рддреНрдордХ рдорд╛рди
рдФрд░ рд╕рддреНрдпрд╛рдкрди рд╡рд░реНрдЧ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди - PersonAgeConstraintValidator.class
public class PersonAgeConstraintValidator implements ConstraintValidator<PersonAgeConstraint, Integer> { @Override public boolean isValid(Integer age, ConstraintValidatorContext constraintValidatorContext) { return age > 0; } }
рдореЗрд░рд╛ рдЕрдкрдирд╛ рдПрдиреЛрдЯреЗрд╢рди рддреИрдпрд╛рд░ рд╣реИ, рд╣рдо рдЗрд╕реЗ рдлрд╝реАрд▓реНрдб рдореЗрдВ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ рдФрд░ рдпрд╣ рдЬрд╛рдВрдЪрдирд╛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕рдВрднрд╡ рд╣реИ, рд╕рднреА рдлрд╝реАрд▓реНрдб рдЬрд┐рди рдкрд░ рдПрдиреЛрдЯреЗрд╢рди рд╣реЛрддреЗ рд╣реИрдВ, рд╕рдВрдмрдВрдзрд┐рдд рдирд┐рдпрдореЛрдВ рджреНрд╡рд╛рд░рд╛ рдЬрд╛рдБрдЪ рдХреА рдЬрд╛рдПрдЧреАред
import javax.validation.Validator; public class DemoJValidationApplicationTests {
рд╕рд╛рдВрддреНрд╡рдирд╛ рдореЗрдВ рдкрд░рд┐рдгрд╛рдо
3-
рдПрдХ рдирд┐рдпрдо рдХреЗ рд░реВрдк рдореЗрдВ, рд╕рдВрджреЗрд╢ рдореЗрдВ рдорд╛рдирдХ рдПрдиреЛрдЯреЗрд╢рди рдХреЗ рд╕рдВрджреЗрд╢ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ:
AnnotationName.entity.fieldname=
рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреА рд╕рдВрд░рдЪрдирд╛

рдкреЛрдо рдлрд╛рдЗрд▓ <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.example</groupId> <artifactId>DemoJSRvalidation</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>DemoJSRvalidation</name> <description>Demo project for Spring Boot JSR-303 validation</description> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.5.RELEASE</version> <relativePath/> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-validation</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
рдЪрд░рдгрдмрджреНрдз рд╕рддреНрдпрд╛рдкрдиред рдХрдХреНрд╖рд╛ рдХреЗ рд▓рд┐рдП <?> [] рд╕рдореВрд╣ (), рдЖрдк рдЙрди рд╡рд░реНрдЧреЛрдВ рдХреЗ рдкреНрд░рдХрд╛рд░ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рдирдХреЗ рджреНрд╡рд╛рд░рд╛ рдЖрдк рдЙрдиреНрд╣реЗрдВ рд╕рдореВрд╣ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдЪреЗрдХ рдХреА рд╕реВрдЪреА рдХреЛ рд╕реАрдорд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЕрд░реНрдерд╛рддред рдПрдХ рдлрд┐рд▓реНрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╕рддреНрдпрд╛рдкрди рдЪрд░рдгреЛрдВ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, 1) рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рдо рд╕реНрд╡рд╛рд╕реНрдереНрдп рдХрд╛рд░рдгреЛрдВ рд╕реЗ, 2) рдФрд░ рдлрд┐рд░ рдкреЗрд╢реЗрд╡рд░ рдбреЗрдЯрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡реНрдпрдХреНрддрд┐ рдХреА рдкрд░реАрдХреНрд╖рд╛ рдХреЛ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рддреЗ рд╣реИрдВред рд╣рдо рджреЛ рдПрдиреЛрдЯреЗрд╢рди рддреИрдпрд╛рд░ рдХрд░реЗрдВрдЧреЗ
HealthConstraint рдФрд░ ProfessionalConstraint рдФрд░ рдЙрдирдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдиред рдкрд╣рд▓реЗ рд╣рдо рд╕реНрд╡рд╛рд╕реНрдереНрдп рдХреЗ рд╕рд╛рде рдЕрдиреБрдкрд╛рд▓рди рдХреА рдЬрд╛рдВрдЪ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдлрд┐рд░ рдпрджрд┐ рдпрд╣ рд╕реНрд╡рд╛рд╕реНрдереНрдп рд╕реЗ рдЧреБрдЬрд░рддрд╛ рд╣реИ, рддреЛ рд╣рдо рдкреЗрд╢реЗрд╡рд░ рдбреЗрдЯрд╛ рдкрд░ рдЬрд╛рдВрдЪ рдХрд░рддреЗ рд╣реИрдВ
рдПрдХ рдЙрджрд╛рд╣рд░рдг:
public class Person { @HealthConstraint(groups = Health.class) private Documents healthDocuments; @ProfessionalConstraint(groups = Professional.class) private Documents ProfessionalDocuments;
HealthConstraint рдПрдиреЛрдЯреЗрд╢рди рдЙрджрд╛рд╣рд░рдг
@Target({ElementType.METHOD, ElementType.FIELD}) @Retention(RetentionPolicy.RUNTIME) @Constraint(validatedBy=HealthConstraintValidator.class) public @interface HealthConstraint { String message() default "{health.documents}"; Class<?>[] groups() default {}; Class<? extends Payload>[] payload() default {}; }
HealthConstraintValidator рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЙрджрд╛рд╣рд░рдг
public class HealthConstraintValidator implements ConstraintValidator<HealthConstraint, Documents> { @Override public boolean isValid(Documents documents, ConstraintValidatorContext constraintValidatorContext) { return documents.contains(" 1"); } }
ProfessionalConstraint рдХреЗ рд▓рд┐рдП рд╕рдм рдХреБрдЫ рд╕рдорд╛рди рд╣реИ
рдЕрдЧрд▓рд╛ рдЪреЗрдХ рдЗрд╕ рддрд░рд╣:
@Test public void healthAndProfessionalValidators() { final Person person = new Person(" ", 45); person.setHealthDocuments(new Documents(Arrays.asList(" 1", " 3"))); person.setProfessionalDocuments(new Documents(Arrays.asList(" 1", " 4")));
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдРрд╕реЗ рдЪреЗрдХ рдХреА рдЬрд░реВрд░рдд рддрдм рдкрдбрд╝рддреА рд╣реИ рдЬрдм рд╣рдо рдХрд┐рд╕реА рдлрд╛рдЗрд▓, рд╡реЗрдм рд╕реЗрд╡рд╛ рдФрд░ рдЕрдиреНрдп рд╕реНрд░реЛрддреЛрдВ рд╕реЗ рдбреЗрдЯрд╛ рд▓реЛрдб рдХрд░рддреЗ рд╣реИрдВред
рдХрдХреНрд╖рд╛ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ public class Documents { private List<String> tests = new ArrayList(); public Documents(List<String> tests) { this.tests.addAll(tests); } public boolean contains(String test) { return this.tests.contains(test); } }
рд╡рд╕рдВрдд рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рдорд╛рдиреНрдпрддрд╛
рд╕реНрдкреНрд░рд┐рдВрдЧ рдХрд╛ рдЕрдкрдирд╛ рд╡реИрд▓рд┐рдбреЗрдЯрд░ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рднреА рд╣реИред
(Org.springframework.validation.Validator)
рдЬрд╛рд╡рд╛ рдореЗрдВ
(Javax.validation.Validator)
рдФрд░ рдпрд╣ рдареАрдХ рдЗрд╕рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИ рдЬреЛ рдбреЗрдЯрд╛ рдХреЛ рдорд╛рдиреНрдп рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдЕрдм рдПрдХ рдШреЛрд╖рдгрд╛рддреНрдордХ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдХреА рдЕрдкрдиреА рд▓рдЪреАрд▓рд╛рдкрди рдФрд░ рд╡реНрдпрд╛рдкрдХрддрд╛ рд╣реИред рдЙрд╕реА рдмрд┐рди рдХреЗ рд▓рд┐рдП, рдореИрдВ рдЙрд╕реА рдЖрдпреБ рдХреА рдЬрд╛рдБрдЪ рдХрд░реВрдБрдЧрд╛ред
рджреЛ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рдХреЗ, рд╣рдо рдорд╛рдиреНрдп рдХрд░рддреЗ рд╣реИрдВ
@Service public class PersonValidator implements Validator { @Override public boolean supports(Class<?> aClass) { return Person.class.equals(aClass); } @Override public void validate(Object obj, Errors errors) { Person p = (Person) obj; if (p.getAge() < 0) { errors.rejectValue("age", "value.negative"); } } }
value.negative - рд╕рдВрджреЗрд╢ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рднреА рдХреБрдВрдЬреА рд╣реИ,
public boolean supports
рд╕рдорд░реНрдерд┐рдд рд╡рд░реНрдЧ рдХреЗ рдкреНрд░рдХрд╛рд░
public boolean supports
рдирд┐рд░реНрдзрд╛рд░рд┐рдд
public boolean supports
ред
рдбреЗрдЯрд╛рдмрд┐рдВрдбрд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕рддреНрдпрд╛рдкрди рд╢реБрд░реВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ
рдПрдХ рдЙрджрд╛рд╣рд░рдг:
@RunWith(SpringRunner.class) @SpringBootTest public class DemoJValidationApplicationTests {
рд╕рднреА рдЬрд╛рдБрдЪ рдЬреЛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХреА рдЧрдИ рд╣реИрдВред рдХрд░реНрдордЪрд╛рд░реА рд╡рд░реНрдЧ рдХреЗ рд▓рд┐рдП org.springframework.validation.Validator рдХрд╛ рдкреНрд░рджрд░реНрд╢рди рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рдЖрдк рдХрдИ рд╕рддреНрдпрд╛рдкрдирдХрд░реНрддрд╛рдУрдВ рдХреЛ рднреА рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ, dataBinder.addValidators, рдЖрдк рдирд┐рдпрдореЛрдВ рдХреА рдПрдХ рд░рдЪрдирд╛ (рдПрдХ рдирд┐рдпрдо рд╕реЗ рдХреЙрд▓, рджреВрд╕рд░рд╛) рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:
public class OtherValidator implements Validator { @Override public boolean supports(Class<?> aClass) { return Person.class.equals(aClass); } @Override public void validate(Object obj, Errors errors) {
рдХрд┐рд╕реА рдХрд╛рд░рдг рд╕реЗ рдореБрдЭреЗ рдЙрдореНрдореАрдж рдереА рдХрд┐ рд╕реНрдкреНрд░рд┐рдВрдЧ рдПрдиреЛрдЯреЗрд╢рди рдореЗрдВ рдЗрдВрдЧрд┐рдд рдХрд┐рдП рдЧрдП рдЪреЗрдХ рднреА рдХрд░реЗрдВрдЧреЗ, рд▓реЗрдХрд┐рди рдирд╣реАрдВ, рдпрд╣ рдХреЙрд▓ рд╕реНрд╡рддрдВрддреНрд░ рд░реВрдк рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреА рд╕рдВрд░рдЪрдирд╛

рдкреЛрдо рдлрд╛рдЗрд▓ <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.example</groupId> <artifactId>DemoJSRvalidation</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>DemoJSRvalidation</name> <description>Demo project for Spring Boot JSR-303 validation</description> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.5.RELEASE</version> <relativePath/> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-validation</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
рдЬрд╛рд╡рд╛ рдФрд░ рд╕реНрдкреНрд░рд┐рдВрдЧ
рдЬрд╛рд╣рд┐рд░ рд╣реИ, рдореИрдВ рдбреЗрдЯрд╛ рд╕рддреНрдпрд╛рдкрди рдореЗрдВ рджреЛ рджреГрд╖реНрдЯрд┐рдХреЛрдгреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ - рдЬрд╛рд╡рд╛ рдФрд░ рд╕реНрдкреНрд░рд┐рдВрдЧ, рдЖрдк рдЙрдиреНрд╣реЗрдВ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ, рдЕрд░реНрдерд╛рддреН, javax.validation.Validator рдХреЙрд▓ рдХреЛ рд╡рд╕рдВрдд
рд╕рддреНрдпрд╛рдкрдирдХрд░реНрддрд╛ рдореЗрдВ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред
рдЙрджрд╛рд╣рд░рдг
import javax.validation.Validator; @Service public class PersonValidator implements org.springframework.validation.Validator {
рд╡рд╕рдВрдд рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рд╣рдо рдЗрдВрдЬреЗрдХреНрд╢рди
javax.validation.Validator
@Autowired
private Validator validator;
public void validate(Object obj, Errors errors)
рд╡рд┐рдзрд┐
public void validate(Object obj, Errors errors)
рдЬрд╛рд╡рд╛ рдкрд░ рдШреЛрд╖рдгрд╛рддреНрдордХ рдЬрд╛рдБрдЪ рдХрд░реЗрдВ рдФрд░ рдлрд┐рд░ рд╕реНрдкреНрд░рд┐рдВрдЧ рдСрд░реНрдЧрди рдкрд░ рд╡реНрдпрдХреНрддрд┐ рд╡рд░реНрдЧ рдХреЗ рд▓рд┐рдП рд╕рднреА рдЬрд╛рдБрдЪ рдХрд░реЗрдВред Springframework.validation.Validatorред
рд╣рдо рд╡рд╕рдВрдд рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕рддреНрдпрд╛рдкрди рднреА рдЪрд▓рд╛рддреЗ рд╣реИрдВ
@Test public void testValidators() { final Person person = new Person("", -4500); final DataBinder dataBinder = new DataBinder(person); dataBinder.addValidators(personValidator); dataBinder.validate(); if (dataBinder.getBindingResult().hasErrors()) { dataBinder.getBindingResult().getAllErrors()
рдЕрдм рд╕рдВрдЧреНрд░рд╣ рдореЗрдВ рд╡реНрдпрдХреНрддрд┐ рдХреЗ рд▓рд┐рдП рдЬрд╛рд╡рд╛ рдФрд░ рд╕реНрдкреНрд░рд┐рдВрдЧ рдПрдиреЛрдЯреЗрд╢рди (org.springframework.validation.Validator) рдХреЗ рдЦрд┐рд▓рд╛рдл рдЪреЗрдХ рд╣реЛрдВрдЧреЗ
рдХрдВрд╕реЛрд▓ рдЖрдЙрдЯрдкреБрдЯ
()
3- ()
(spring)
рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреА рд╕рдВрд░рдЪрдирд╛

рд╕реНрдкреНрд░рд┐рдВрдЧ mvc
рдмреЗрд╢рдХ, рдЕрдм рдпрд╣ рд╕рдм рдПрдХ рд╡реЗрдм рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рд╣рдо рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдирд┐рдпрдВрддреНрд░рдХ, jsp рдкреГрд╖реНрда рдХреЛ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ (рдпрд╣рд╛рдВ, рд╡реИрд╕реЗ, рдЕрдиреНрдп рд╡рд┐рдХрд▓реНрдк рднреА рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, freeMarker, рдЖрджрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреЗрдЬ рдмрдирд╛рдирд╛), рд╕реАрдПрд╕рдПрд╕ рд╢реИрд▓реА, рдкреЛрдо рдирд┐рд░реНрднрд░рддрд╛ред рдФрд░ рдЗрд╕рд▓рд┐рдП рдХреНрд░рдо рдореЗрдВ
1) MVC рдирд┐рдпрдВрддреНрд░рдХ
import org.springframework.validation.Validator; @Controller public class DemoJValidationController { @Autowired @Qualifier("personValidator")
рдпрд╣рд╛рдБ рд╡рд╕рдВрдд рдЗрдВрдЬреЗрдХреНрд╢рди рдХреЗ рд╕рд╛рде рд╡реНрдпрдХреНрддрд┐рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рд╣реИ
@Autowired
@Qualifier("personValidator") // spring validator
private Validator personValidator;
initBinder рдореЗрдВ рд╡реНрдпрдХреНрддрд┐рд╡рд┐рднрд╛рдЬрдХ рдХреЛ рд╕реЗрдЯ рдХрд░реЗрдВ
@InitBinder
protected void initBinder(WebDataBinder binder) {
binder.setValidator(personValidator);
}
@Valid
@ рдЯреНрд░рд┐рдЧрд░
@Valid
рдПрдиреЛрдЯреЗрд╢рди рджреНрд╡рд╛рд░рд╛ рдЯреНрд░рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛
рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдХреЗрд╡рд▓ рд╡рд╕рдВрдд рдХреА рдЬрд╛рдВрдЪ рдХреА рдЬрд╛рдПрдЧреА, рдШреЛрд╖рдгрд╛рддреНрдордХ рдЬрд╛рдВрдЪ рдХреЛ рдирдЬрд░рдЕрдВрджрд╛рдЬ рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рдпрджрд┐ рдХреЛрдб рд╕реЗ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ
@InitBinder
protected void initBinder(WebDataBinder binder)
рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд, рд╕рднреА рдШреЛрд╖рдгрд╛рддреНрдордХ рдЬрд╛рдВрдЪ рдХреА рдЬрд╛рдПрдЧреА, рдФрд░ рд╡рд╕рдВрдд рдХреА рдЙрдкреЗрдХреНрд╖рд╛ рдХреА рдЬрд╛рдПрдЧреАред
рд╕рднреА рдЪреЗрдХ, рдШреЛрд╖рдгрд╛рддреНрдордХ рдФрд░ рд╡рд╕рдВрдд рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рдпрд╣ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
@InitBinder рдирд┐рдХрд╛рд▓реЗрдВ, рдЗрдВрдЬреЗрдХреНрд╢рди рдЫреЛрдбрд╝реЗрдВ
@Autowired
@Qualifier("personValidator") // spring validator
private Validator personValidator;
рдФрд░ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдПрдХ рд╕реНрдкреНрд░рд┐рдВрдЧ рдЪреЗрдХ рдХреЙрд▓ рдЬреЛрдбрд╝реЗрдВ
// spring validate
personValidator.validate(person, bindingResult);
рдпрд╣рд╛рдБ рдХреЛрдб рд╣реИ:
@Controller public class DemoJValidationController { @Autowired @Qualifier("personValidator")
рдпрд╛рдиреА рд╡рд╕рдВрдд рд╕реЗ рдЕрддрд┐рд░рд┐рдХреНрдд рдЪреЗрдХ рдмрд╛рдзреНрдпрдХрд╛рд░реА рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рдПрдЧрд╛ред :-) :-), рдЬреЛ рдХрд┐ рдореИрдВ рдЪрд╛рд╣рддрд╛ рдерд╛!
рдЬреЗрдПрд╕рдкреА рдФрд░ рдореЙрдбрд▓ рдореЗрдВ рдбреЗрдЯрд╛ рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рд╡рд┐рд╢реЗрд╖рддрд╛ рджреНрд╡рд╛рд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ -
modelAttribute="person"
рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рд╕реНрдкреНрд░рд┐рдВрдЧрдПрдорд╡реАрд╕реА рдХрд╛ рдлреЙрд░реНрдо рдЯреИрдЧ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рд╣реИред
рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╢реЗрд╖ рд╕рдВрд╕рд╛рдзрди рд╣реИрдВ:
DemoJValidationApplication @SpringBootApplication @ImportResource("classpath:configuration.xml") public class DemoJValidationApplication { public static void main(String[] args) { SpringApplication.run(DemoJValidationApplication.class, args); } }
рд╡рд╕рдВрдд рд╡рд┐рдиреНрдпрд╛рд╕
configuration.xml <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:beans="http://www.springframework.org/schema/c" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd"> <bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource"> <property name="basename" value="classpath:message"/> <property name="defaultEncoding" value="UTF-8"/> </bean> <mvc:annotation-driven/> <mvc:resources mapping="/resources/**" location="classpath:/META-INF/resources/"/> </beans>
personEdit.jsp <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <html> <head> <link href="<c:url value="/resources/my.css" />" rel="stylesheet"> <title>Person</title> </head> <body> <h3> Enter Person. </h3> <form:form method="POST" modelAttribute="person" action="save"> <div> Name: <form:input path="name"/> <form:errors path="name" cssClass="error"/> </div> <div> Age: <form:input path="age"/> <form:errors path="age" cssClass="error"/> </div> <button type="submit">Registration</button> </form:form> </body> </html>
saveSuccess.jsp <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <html> <head> <link href="<c:url value="/resources/my.css" />" rel="stylesheet"> <title>Person Saved Successfully</title> </head> <body> <h3> Person Saved Successfully. </h3> <form:form method="POST" modelAttribute="person" action="edit"> <div> ${name} </div> <div> ${age} </div> <button type="submit">Edit</button> </form:form> </body> </html>
my.css span.error { color: red; } form div{ margin: 5px; }
рдкреЛрдо рдлрд╛рдЗрд▓ <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.example</groupId> <artifactId>DemoJSRvalidation</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>DemoJSRvalidation</name> <description>Demo project for Spring Boot JSR-303 validation</description> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.5.RELEASE</version> <relativePath/> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-validation</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-validator</artifactId> <version>4.1.0.Final</version> </dependency> <dependency> <groupId>org.apache.tomcat.embed</groupId> <artifactId>tomcat-embed-jasper</artifactId> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>jstl</artifactId> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреА рд╕рдВрд░рдЪрдирд╛

рдЖрд╡реЗрджрди рдХрд╛ рдХрд╛рдо

рд╕рд╛рдордЧреНрд░реА
рдмреАрди рд╕рддреНрдпрд╛рдкрди рд╡рд┐рдирд┐рд░реНрджреЗрд╢