рдбреЗрдЯрд╛ рд╕рддреНрдпрд╛рдкрди - рдЬрд╛рд╡рд╛ рдФрд░ рд╕реНрдкреНрд░рд┐рдВрдЧ рд╕рддреНрдпрд╛рдкрди

рдЬрд╛рд╡рд╛ рдореЗрдВ рд╡рд░реНрдЧ рдбреЗрдЯрд╛ (рдмреАрди) рдХреЛ рдорд╛рдиреНрдп рдХрд░рдирд╛ рдПрдХ рдирдпрд╛ рд╡рд┐рд╖рдп рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣рд╛рдВ рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рдореИрдВ рд╡рд┐рднрд┐рдиреНрди рдкрд╣рд▓реБрдУрдВ рдХреЛ рдЬреЛрдбрд╝реВрдВрдЧрд╛: рдЬреЗрдПрд╕рдЖрд░ -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; /** * Test Validation */ public class DemoJValidationApplicationTests { //  Validator private static Validator validator; static { ValidatorFactory validatorFactory = Validation.buildDefaultValidatorFactory(); validator = validatorFactory.usingContext().getValidator(); } @Test public void testValidators() { final Person person = new Person(" ", -4500); Set<ConstraintViolation<Person>> validates = validator.validate(person); Assert.assertTrue(validates.size() > 0); validates.stream().map(v -> v.getMessage()) .forEach(System.out::println); } } 

рд╕рд╛рдВрддреНрд╡рдирд╛ рдореЗрдВ рдкрд░рд┐рдгрд╛рдо

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/> <!-- lookup parent from repository --> </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"))); //    Set<ConstraintViolation<Person>> validates = validator.validate(person, Health.class); Assert.assertTrue(validates.size() == 0); //    ,  .  validates = validator.validate(person, Professional.class); Assert.assertTrue(validates.size() == 0); } 

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдРрд╕реЗ рдЪреЗрдХ рдХреА рдЬрд░реВрд░рдд рддрдм рдкрдбрд╝рддреА рд╣реИ рдЬрдм рд╣рдо рдХрд┐рд╕реА рдлрд╛рдЗрд▓, рд╡реЗрдм рд╕реЗрд╡рд╛ рдФрд░ рдЕрдиреНрдп рд╕реНрд░реЛрддреЛрдВ рд╕реЗ рдбреЗрдЯрд╛ рд▓реЛрдб рдХрд░рддреЗ рд╣реИрдВред

рдХрдХреНрд╖рд╛ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝
 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 { //    private static final ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource(); static { messageSource.setBasename("message"); } @Autowired private PersonValidator personValidator; @Test public void testValidators() { final Person person = new Person(" ", -4500); final DataBinder dataBinder = new DataBinder(person); dataBinder.addValidators(personValidator); dataBinder.validate(); Assert.assertTrue(dataBinder.getBindingResult().hasErrors()); if (dataBinder.getBindingResult().hasErrors()) { dataBinder.getBindingResult().getAllErrors().stream(). forEach(e -> System.out.println(messageSource .getMessage(e, Locale.getDefault()))); } } } 

рд╕рднреА рдЬрд╛рдБрдЪ рдЬреЛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХреА рдЧрдИ рд╣реИрдВред рдХрд░реНрдордЪрд╛рд░реА рд╡рд░реНрдЧ рдХреЗ рд▓рд┐рдП 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) { // ... } } //--------- @Service public class PersonValidator implements Validator { /** *   */ @Autowired private OtherValidator otherValidator; @Override public void validate(Object obj, Errors errors) { Person p = (Person) obj; if (p.getAge() < 0) { errors.rejectValue("age", "value.negative"); } //   ,   otherValidator.validate(obj, 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/> <!-- lookup parent from repository --> </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; @Override public boolean supports(Class<?> aClass) { return Person.class.equals(aClass); } @Override public void validate(Object obj, Errors errors) { Set<ConstraintViolation<Object>> validates = validator.validate(obj); for (ConstraintViolation<Object> constraintViolation : validates) { String propertyPath = constraintViolation.getPropertyPath().toString(); String message = constraintViolation.getMessage(); errors.rejectValue(propertyPath, "", message); } Person p = (Person) obj; if (p.getAge() < 0) { errors.rejectValue("age", "only.positive.numbers"); } } } 

рд╡рд╕рдВрдд рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рд╣рдо рдЗрдВрдЬреЗрдХреНрд╢рди 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") // spring validator private Validator personValidator; @InitBinder protected void initBinder(WebDataBinder binder) { binder.setValidator(personValidator); } @GetMapping("/") public String savePersonAction(ModelMap model) { model.addAttribute("person", new Person(null, null)); return "personEdit"; } @RequestMapping(value = "/save", method = RequestMethod.POST) public String savePersonAction( @Valid @ModelAttribute("person") Person person, BindingResult bindingResult, Model model) { if (bindingResult.hasErrors()) { return "personEdit"; // to person.jsp page } model.addAttribute("name", person.getName()); model.addAttribute("age", person.getAge()); return "saveSuccess"; // to saveSuccess.jsp page } @RequestMapping(value = "/edit", method = RequestMethod.POST) public String editPersonAction(ModelMap model) { model.addAttribute("person", new Person(null, null)); return "personEdit"; // to personEdit.jsp page; } } 

рдпрд╣рд╛рдБ рд╡рд╕рдВрдд рдЗрдВрдЬреЗрдХреНрд╢рди рдХреЗ рд╕рд╛рде рд╡реНрдпрдХреНрддрд┐рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рд╣реИ

@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") // spring validator private Validator personValidator; //... @RequestMapping(value = "/save", method = RequestMethod.POST) public String savePersonAction( @Valid @ModelAttribute("person") Person person, BindingResult bindingResult, Model model) { // spring validate personValidator.validate(person, bindingResult); if (bindingResult.hasErrors()) { return "personEdit"; // to person.jsp page } model.addAttribute("name", person.getName()); model.addAttribute("age", person.getAge()); return "saveSuccess"; // to saveSuccess.jsp page } } 

рдпрд╛рдиреА рд╡рд╕рдВрдд рд╕реЗ рдЕрддрд┐рд░рд┐рдХреНрдд рдЪреЗрдХ рдмрд╛рдзреНрдпрдХрд╛рд░реА рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рдПрдЧрд╛ред :-) :-), рдЬреЛ рдХрд┐ рдореИрдВ рдЪрд╛рд╣рддрд╛ рдерд╛!

рдЬреЗрдПрд╕рдкреА рдФрд░ рдореЙрдбрд▓ рдореЗрдВ рдбреЗрдЯрд╛ рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рд╡рд┐рд╢реЗрд╖рддрд╛ рджреНрд╡рд╛рд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ - 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/> <!-- lookup parent from repository --> </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> 


рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреА рд╕рдВрд░рдЪрдирд╛

рдЫрд╡рд┐

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

рдЫрд╡рд┐

рд╕рд╛рдордЧреНрд░реА

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

Source: https://habr.com/ru/post/hi424819/


All Articles