SlideShare une entreprise Scribd logo
1  sur  18
Télécharger pour lire hors ligne
JSR-303

Bean Validation
Spring MVC Validator
public interface Validator {

    boolean supports(Class<?> clazz);

    void validate(Object target, Errors errors);
}
Spring MVC Validator
● Spring MVC specific
● Can not be used on client side
● All validation goes to single method
● Hard to make unit tests
Description
"This JSR will define a meta-data model and API
for JavaBeanTM validation based on annotations,
with overrides and extended meta-data through
the use of XML validation descriptors."
Key points
● Configured with annotations
● Not tied to a specific application tier
● Suits both server and client side
Implementations
● Hibernate Validator (reference implementation)
● Apache Bean Validation (incubation)
● GWT Validation
Annotation samples
   @Min         @Future          @Null

       @Past
                      @NotNull
                                   @Digits
@MyCustomMegaConstraint

                                 @Max
                    @Size
     @Pattern
Custom constraint sample
@Target(TYPE)
@Retention(RUNTIME)
@Constraint(validatedBy = UniqueProductInOrderValidator.class)
public @interface UniqueProductInOrder {

    String message() default "Only unique items";
    Class<?>[] groups() default {};
    Class<? extends Payload>[] payload() default {};

}
Bean sample
@UniqueProductInOrder
public class Item {
    private String product;
    @Valid private Order order;

     @NotBlank
     @Length(min = 5, max = 30)
     public String getProduct() {
    return product;
     }
}
Validator sample
public class UniqueProductInOrderValidator implements
          ConstraintValidator<UniqueProductInOrder, Item> {

    @Override
    public boolean isValid(Item v, ConstraintValidatorContext c) {
        Collection<Item> items = value.getOrder().getItems();
         Set<Item> set = new HashSet<Item>(items);
         return set.size() == items.size();
    }
}
Invoke validation sample
@RequestMapping(method = POST)
public String create(@Valid Item item) {
   orderRepository.update(item.getOrder());
   return "redirect:/orders/" + item.getOrder().getId();
}

@ExceptionHandler(BindException.class)
public ModelAndView itemHasErrors(BindException e) {
    return new ModelAndView("addItem", e.getModel());
}
Another sample
@RequestMapping(value = "/orders", method = POST)
public String create(@Valid Order order, BindingResult errors) {

    if (errors.hasErrors()) {
          return null;
    }

    orderRepository.save(order);

    return "redirect:/orders";
}
Groups sample

@GroupSequence({ Item.class, ComplexValidation.class })
@UniqueProductInOrder(groups = ComplexValidation.class)
public class Item {

    @NotBlank
    private String product;

}

interface ComplexValidation {}
Service layer validation
public class SomeService {

    @Inject
    private Validator validator;

    public void doSomething(Item item) {
        Set<ConstraintViolation<Order>> violations =
             validator.validate(item);
    }
}
Unit test sample
@Test
public void noValidationErrorsWhenItemIsValid() {
     Item item = new Item(order, "x", 0);

    Validator validator =
              Validation.buildDefaultValidatorFactory().getValidator();

    Set<ConstraintViolation<Item>> violations = validator.validate(item);

    assertTrue(violations.isEmpty());
}
Single property unit test sample
@Test
public void nullProductIsNotAllowed() {
    Item item = new Item(order, null, 0);
     Validator validator =
          Validation.buildDefaultValidatorFactory().getValidator();
    Set<ConstraintViolation<Item>> violations =
          validator.validateProperty(item, "product");
    assertFalse(violations.isEmpty());
}
Hibernate Validator Annotation
              Processor
       Annotation processor based on JSR-269 which plugs
into the build process and raises compilation errors
whenever constraint annotations are incorrectly used.
https://github.com/aleksz/spring-
            reference

Contenu connexe

Tendances

Tech In Asia PDC 2017 - Best practice unit testing in mobile apps
Tech In Asia PDC 2017 - Best practice unit testing in mobile appsTech In Asia PDC 2017 - Best practice unit testing in mobile apps
Tech In Asia PDC 2017 - Best practice unit testing in mobile appsFandy Gotama
 
ASP.NET MVC 3.0 Validation
ASP.NET MVC 3.0 ValidationASP.NET MVC 3.0 Validation
ASP.NET MVC 3.0 ValidationEyal Vardi
 
Scrum Gathering 2012 Shanghai_工程实践与技术卓越分会场:how to write unit test for new cod...
Scrum Gathering 2012 Shanghai_工程实践与技术卓越分会场:how to write unit test for new cod...Scrum Gathering 2012 Shanghai_工程实践与技术卓越分会场:how to write unit test for new cod...
Scrum Gathering 2012 Shanghai_工程实践与技术卓越分会场:how to write unit test for new cod...LetAgileFly
 
Taking a Test Drive
Taking a Test DriveTaking a Test Drive
Taking a Test DriveGraham Lee
 
Policy Injection in ASP.NET using Enterprise Library 3.0
Policy Injection in ASP.NET using Enterprise Library 3.0Policy Injection in ASP.NET using Enterprise Library 3.0
Policy Injection in ASP.NET using Enterprise Library 3.0PhilWinstanley
 
Controllers & actions
Controllers & actionsControllers & actions
Controllers & actionsEyal Vardi
 
Understanding JavaScript Testing
Understanding JavaScript TestingUnderstanding JavaScript Testing
Understanding JavaScript Testingjeresig
 
Qtp 9.2 tutorials
Qtp 9.2 tutorialsQtp 9.2 tutorials
Qtp 9.2 tutorialsmedsherb
 
qtp 9.2 features
qtp 9.2 featuresqtp 9.2 features
qtp 9.2 featureskrishna3032
 
Qtp 92 Tutorial Anil
Qtp 92 Tutorial AnilQtp 92 Tutorial Anil
Qtp 92 Tutorial Anilguest3373d3
 
Qtp 92 Tutorial
Qtp 92 TutorialQtp 92 Tutorial
Qtp 92 Tutorialsasidhar
 
Qtp 92 Tutorial769
Qtp 92 Tutorial769Qtp 92 Tutorial769
Qtp 92 Tutorial769subhasis100
 
Qtp 9.2 Tutorial
Qtp 9.2 TutorialQtp 9.2 Tutorial
Qtp 9.2 Tutorialguest37ae7f
 
20131004 - Sq lite sample by Jax
20131004 - Sq lite sample by Jax20131004 - Sq lite sample by Jax
20131004 - Sq lite sample by JaxLearningTech
 
SpringOne 2GX 2013 - Spring Testing
SpringOne 2GX 2013 - Spring TestingSpringOne 2GX 2013 - Spring Testing
SpringOne 2GX 2013 - Spring TestingMattias Severson
 
Substitute Receipt (Oracle-Purchasing R12.2.0)
Substitute Receipt (Oracle-Purchasing R12.2.0)Substitute Receipt (Oracle-Purchasing R12.2.0)
Substitute Receipt (Oracle-Purchasing R12.2.0)FAHAD ULLAH
 

Tendances (20)

Tech In Asia PDC 2017 - Best practice unit testing in mobile apps
Tech In Asia PDC 2017 - Best practice unit testing in mobile appsTech In Asia PDC 2017 - Best practice unit testing in mobile apps
Tech In Asia PDC 2017 - Best practice unit testing in mobile apps
 
ASP.NET MVC 3.0 Validation
ASP.NET MVC 3.0 ValidationASP.NET MVC 3.0 Validation
ASP.NET MVC 3.0 Validation
 
Scrum Gathering 2012 Shanghai_工程实践与技术卓越分会场:how to write unit test for new cod...
Scrum Gathering 2012 Shanghai_工程实践与技术卓越分会场:how to write unit test for new cod...Scrum Gathering 2012 Shanghai_工程实践与技术卓越分会场:how to write unit test for new cod...
Scrum Gathering 2012 Shanghai_工程实践与技术卓越分会场:how to write unit test for new cod...
 
Taking a Test Drive
Taking a Test DriveTaking a Test Drive
Taking a Test Drive
 
Policy Injection in ASP.NET using Enterprise Library 3.0
Policy Injection in ASP.NET using Enterprise Library 3.0Policy Injection in ASP.NET using Enterprise Library 3.0
Policy Injection in ASP.NET using Enterprise Library 3.0
 
Controllers & actions
Controllers & actionsControllers & actions
Controllers & actions
 
Ngrx: Redux in angular
Ngrx: Redux in angularNgrx: Redux in angular
Ngrx: Redux in angular
 
Understanding JavaScript Testing
Understanding JavaScript TestingUnderstanding JavaScript Testing
Understanding JavaScript Testing
 
iOS Talks 6: Unit Testing
iOS Talks 6: Unit TestingiOS Talks 6: Unit Testing
iOS Talks 6: Unit Testing
 
Qtp 9.2 tutorials
Qtp 9.2 tutorialsQtp 9.2 tutorials
Qtp 9.2 tutorials
 
qtp 9.2 features
qtp 9.2 featuresqtp 9.2 features
qtp 9.2 features
 
Qtp 92 Tutorial Anil
Qtp 92 Tutorial AnilQtp 92 Tutorial Anil
Qtp 92 Tutorial Anil
 
Qtp 92 Tutorial
Qtp 92 TutorialQtp 92 Tutorial
Qtp 92 Tutorial
 
Qtp 92 Tutorial769
Qtp 92 Tutorial769Qtp 92 Tutorial769
Qtp 92 Tutorial769
 
Qtp 9.2 Tutorial
Qtp 9.2 TutorialQtp 9.2 Tutorial
Qtp 9.2 Tutorial
 
20131004 - Sq lite sample by Jax
20131004 - Sq lite sample by Jax20131004 - Sq lite sample by Jax
20131004 - Sq lite sample by Jax
 
cbvalidation
cbvalidationcbvalidation
cbvalidation
 
SpringOne 2GX 2013 - Spring Testing
SpringOne 2GX 2013 - Spring TestingSpringOne 2GX 2013 - Spring Testing
SpringOne 2GX 2013 - Spring Testing
 
Substitute Receipt (Oracle-Purchasing R12.2.0)
Substitute Receipt (Oracle-Purchasing R12.2.0)Substitute Receipt (Oracle-Purchasing R12.2.0)
Substitute Receipt (Oracle-Purchasing R12.2.0)
 
React with Redux
React with ReduxReact with Redux
React with Redux
 

En vedette

โรคอ้วน กลุ่มเทรนเนอร์ ม.1/10
โรคอ้วน กลุ่มเทรนเนอร์  ม.1/10 โรคอ้วน กลุ่มเทรนเนอร์  ม.1/10
โรคอ้วน กลุ่มเทรนเนอร์ ม.1/10 ppluem
 
Declarative input validation with JSR 303 and ExtVal
Declarative input validation with JSR 303 and ExtVal Declarative input validation with JSR 303 and ExtVal
Declarative input validation with JSR 303 and ExtVal Bart Kummel
 
Declarative Input Validation with JSR 303 and ExtVal
Declarative Input Validation with JSR 303 and ExtValDeclarative Input Validation with JSR 303 and ExtVal
Declarative Input Validation with JSR 303 and ExtValBart Kummel
 
My journey to use a validation framework
My journey to use a validation frameworkMy journey to use a validation framework
My journey to use a validation frameworksaqibsarwar
 
Material movingirls
Material movingirlsMaterial movingirls
Material movingirlsMartaMuros
 
Highlights from the EMC & VMware CIO Summit
Highlights from the EMC & VMware CIO SummitHighlights from the EMC & VMware CIO Summit
Highlights from the EMC & VMware CIO SummitEMC
 
Facebook vs Twitter
Facebook vs TwitterFacebook vs Twitter
Facebook vs TwitterSiti Rizki
 
IDC: Selecting the Optimal Path to Private Cloud
IDC: Selecting the Optimal Path to Private CloudIDC: Selecting the Optimal Path to Private Cloud
IDC: Selecting the Optimal Path to Private CloudEMC
 
Force Cyber Criminals to Shop Elsewhere
Force Cyber Criminals to Shop ElsewhereForce Cyber Criminals to Shop Elsewhere
Force Cyber Criminals to Shop ElsewhereEMC
 
Insaat kursu-izmir
Insaat kursu-izmirInsaat kursu-izmir
Insaat kursu-izmirsersld54
 
الإسلاميون والحكم .. المخاوف والتحديات
الإسلاميون والحكم .. المخاوف والتحدياتالإسلاميون والحكم .. المخاوف والتحديات
الإسلاميون والحكم .. المخاوف والتحدياتبصمات عابر
 
Occupational therapy
Occupational therapyOccupational therapy
Occupational therapyLaurel Blond
 
White Paper: Next-Generation Genome Sequencing Using EMC Isilon Scale-Out NAS...
White Paper: Next-Generation Genome Sequencing Using EMC Isilon Scale-Out NAS...White Paper: Next-Generation Genome Sequencing Using EMC Isilon Scale-Out NAS...
White Paper: Next-Generation Genome Sequencing Using EMC Isilon Scale-Out NAS...EMC
 
Theoretical research
Theoretical researchTheoretical research
Theoretical researchChloeMateides
 
Allocation methods
Allocation methodsAllocation methods
Allocation methodsTravis Klein
 
Full-time Prospectus 2012/13
Full-time Prospectus 2012/13Full-time Prospectus 2012/13
Full-time Prospectus 2012/13HelenTY
 
Linux kursu-bayrampasa
Linux kursu-bayrampasaLinux kursu-bayrampasa
Linux kursu-bayrampasasersld67
 
Evaluation for media
Evaluation for mediaEvaluation for media
Evaluation for medialoousmith
 
PyCon lightning talk on my Toro module for Tornado
PyCon lightning talk on my Toro module for TornadoPyCon lightning talk on my Toro module for Tornado
PyCon lightning talk on my Toro module for Tornadoemptysquare
 

En vedette (20)

โรคอ้วน กลุ่มเทรนเนอร์ ม.1/10
โรคอ้วน กลุ่มเทรนเนอร์  ม.1/10 โรคอ้วน กลุ่มเทรนเนอร์  ม.1/10
โรคอ้วน กลุ่มเทรนเนอร์ ม.1/10
 
Declarative input validation with JSR 303 and ExtVal
Declarative input validation with JSR 303 and ExtVal Declarative input validation with JSR 303 and ExtVal
Declarative input validation with JSR 303 and ExtVal
 
Declarative Input Validation with JSR 303 and ExtVal
Declarative Input Validation with JSR 303 and ExtValDeclarative Input Validation with JSR 303 and ExtVal
Declarative Input Validation with JSR 303 and ExtVal
 
My journey to use a validation framework
My journey to use a validation frameworkMy journey to use a validation framework
My journey to use a validation framework
 
Material movingirls
Material movingirlsMaterial movingirls
Material movingirls
 
5 s___toyota
5  s___toyota5  s___toyota
5 s___toyota
 
Highlights from the EMC & VMware CIO Summit
Highlights from the EMC & VMware CIO SummitHighlights from the EMC & VMware CIO Summit
Highlights from the EMC & VMware CIO Summit
 
Facebook vs Twitter
Facebook vs TwitterFacebook vs Twitter
Facebook vs Twitter
 
IDC: Selecting the Optimal Path to Private Cloud
IDC: Selecting the Optimal Path to Private CloudIDC: Selecting the Optimal Path to Private Cloud
IDC: Selecting the Optimal Path to Private Cloud
 
Force Cyber Criminals to Shop Elsewhere
Force Cyber Criminals to Shop ElsewhereForce Cyber Criminals to Shop Elsewhere
Force Cyber Criminals to Shop Elsewhere
 
Insaat kursu-izmir
Insaat kursu-izmirInsaat kursu-izmir
Insaat kursu-izmir
 
الإسلاميون والحكم .. المخاوف والتحديات
الإسلاميون والحكم .. المخاوف والتحدياتالإسلاميون والحكم .. المخاوف والتحديات
الإسلاميون والحكم .. المخاوف والتحديات
 
Occupational therapy
Occupational therapyOccupational therapy
Occupational therapy
 
White Paper: Next-Generation Genome Sequencing Using EMC Isilon Scale-Out NAS...
White Paper: Next-Generation Genome Sequencing Using EMC Isilon Scale-Out NAS...White Paper: Next-Generation Genome Sequencing Using EMC Isilon Scale-Out NAS...
White Paper: Next-Generation Genome Sequencing Using EMC Isilon Scale-Out NAS...
 
Theoretical research
Theoretical researchTheoretical research
Theoretical research
 
Allocation methods
Allocation methodsAllocation methods
Allocation methods
 
Full-time Prospectus 2012/13
Full-time Prospectus 2012/13Full-time Prospectus 2012/13
Full-time Prospectus 2012/13
 
Linux kursu-bayrampasa
Linux kursu-bayrampasaLinux kursu-bayrampasa
Linux kursu-bayrampasa
 
Evaluation for media
Evaluation for mediaEvaluation for media
Evaluation for media
 
PyCon lightning talk on my Toro module for Tornado
PyCon lightning talk on my Toro module for TornadoPyCon lightning talk on my Toro module for Tornado
PyCon lightning talk on my Toro module for Tornado
 

Similaire à Jsr 303

Jug Guice Presentation
Jug Guice PresentationJug Guice Presentation
Jug Guice PresentationDmitry Buzdin
 
Entity framework db model的驗證機制 20130914
Entity framework db model的驗證機制 20130914Entity framework db model的驗證機制 20130914
Entity framework db model的驗證機制 20130914LearningTech
 
Spring 3: What's New
Spring 3: What's NewSpring 3: What's New
Spring 3: What's NewTed Pennings
 
ASP.NET Web API
ASP.NET Web APIASP.NET Web API
ASP.NET Web APIhabib_786
 
Test-driven Development with AEM
Test-driven Development with AEMTest-driven Development with AEM
Test-driven Development with AEMJan Wloka
 
Apex Testing and Best Practices
Apex Testing and Best PracticesApex Testing and Best Practices
Apex Testing and Best PracticesJitendra Zaa
 
Beautiful java script
Beautiful java scriptBeautiful java script
Beautiful java scriptÜrgo Ringo
 
Pragmatic unittestingwithj unit
Pragmatic unittestingwithj unitPragmatic unittestingwithj unit
Pragmatic unittestingwithj unitliminescence
 
Integration Testing With ScalaTest and MongoDB
Integration Testing With ScalaTest and MongoDBIntegration Testing With ScalaTest and MongoDB
Integration Testing With ScalaTest and MongoDBMichal Bigos
 
Java EE 8 security and JSON binding API
Java EE 8 security and JSON binding APIJava EE 8 security and JSON binding API
Java EE 8 security and JSON binding APIAlex Theedom
 
Introduction to Spring MVC
Introduction to Spring MVCIntroduction to Spring MVC
Introduction to Spring MVCRichard Paul
 
Building a Pyramid: Symfony Testing Strategies
Building a Pyramid: Symfony Testing StrategiesBuilding a Pyramid: Symfony Testing Strategies
Building a Pyramid: Symfony Testing StrategiesCiaranMcNulty
 
Build Widgets
Build WidgetsBuild Widgets
Build Widgetsscottw
 
Integrating Wicket with Java EE 6
Integrating Wicket with Java EE 6Integrating Wicket with Java EE 6
Integrating Wicket with Java EE 6Michael Plöd
 
Intro to Unit Testing in AngularJS
Intro to Unit Testing in AngularJSIntro to Unit Testing in AngularJS
Intro to Unit Testing in AngularJSJim Lynch
 
Asp netmvc e03
Asp netmvc e03Asp netmvc e03
Asp netmvc e03Yu GUAN
 
Building Modern Websites with ASP.NET by Rachel Appel
Building Modern Websites with ASP.NET by Rachel AppelBuilding Modern Websites with ASP.NET by Rachel Appel
Building Modern Websites with ASP.NET by Rachel Appel.NET Conf UY
 
The secret unit testing tools no one has ever told you about
The secret unit testing tools no one has ever told you aboutThe secret unit testing tools no one has ever told you about
The secret unit testing tools no one has ever told you aboutDror Helper
 

Similaire à Jsr 303 (20)

Jug Guice Presentation
Jug Guice PresentationJug Guice Presentation
Jug Guice Presentation
 
Entity framework db model的驗證機制 20130914
Entity framework db model的驗證機制 20130914Entity framework db model的驗證機制 20130914
Entity framework db model的驗證機制 20130914
 
Spring 3: What's New
Spring 3: What's NewSpring 3: What's New
Spring 3: What's New
 
ASP.NET Web API
ASP.NET Web APIASP.NET Web API
ASP.NET Web API
 
Test-driven Development with AEM
Test-driven Development with AEMTest-driven Development with AEM
Test-driven Development with AEM
 
Apex Testing and Best Practices
Apex Testing and Best PracticesApex Testing and Best Practices
Apex Testing and Best Practices
 
Beautiful java script
Beautiful java scriptBeautiful java script
Beautiful java script
 
Pragmatic unittestingwithj unit
Pragmatic unittestingwithj unitPragmatic unittestingwithj unit
Pragmatic unittestingwithj unit
 
Integration Testing With ScalaTest and MongoDB
Integration Testing With ScalaTest and MongoDBIntegration Testing With ScalaTest and MongoDB
Integration Testing With ScalaTest and MongoDB
 
Java EE 8 security and JSON binding API
Java EE 8 security and JSON binding APIJava EE 8 security and JSON binding API
Java EE 8 security and JSON binding API
 
Introduction to Spring MVC
Introduction to Spring MVCIntroduction to Spring MVC
Introduction to Spring MVC
 
Building a Pyramid: Symfony Testing Strategies
Building a Pyramid: Symfony Testing StrategiesBuilding a Pyramid: Symfony Testing Strategies
Building a Pyramid: Symfony Testing Strategies
 
Build Widgets
Build WidgetsBuild Widgets
Build Widgets
 
Unit testing with mock libs
Unit testing with mock libsUnit testing with mock libs
Unit testing with mock libs
 
Integrating Wicket with Java EE 6
Integrating Wicket with Java EE 6Integrating Wicket with Java EE 6
Integrating Wicket with Java EE 6
 
Intro to Unit Testing in AngularJS
Intro to Unit Testing in AngularJSIntro to Unit Testing in AngularJS
Intro to Unit Testing in AngularJS
 
Wicket 6
Wicket 6Wicket 6
Wicket 6
 
Asp netmvc e03
Asp netmvc e03Asp netmvc e03
Asp netmvc e03
 
Building Modern Websites with ASP.NET by Rachel Appel
Building Modern Websites with ASP.NET by Rachel AppelBuilding Modern Websites with ASP.NET by Rachel Appel
Building Modern Websites with ASP.NET by Rachel Appel
 
The secret unit testing tools no one has ever told you about
The secret unit testing tools no one has ever told you aboutThe secret unit testing tools no one has ever told you about
The secret unit testing tools no one has ever told you about
 

Plus de Aleksandr Zhuikov

Plus de Aleksandr Zhuikov (6)

Git glossary
Git glossaryGit glossary
Git glossary
 
Ja coco ignite
Ja coco igniteJa coco ignite
Ja coco ignite
 
Confluence performance testing
Confluence performance testingConfluence performance testing
Confluence performance testing
 
Client+server side bean validation
Client+server side bean validationClient+server side bean validation
Client+server side bean validation
 
Titanium
TitaniumTitanium
Titanium
 
Running Selenium tests on CI server
Running Selenium tests on CI serverRunning Selenium tests on CI server
Running Selenium tests on CI server
 

Jsr 303

  • 2. Spring MVC Validator public interface Validator { boolean supports(Class<?> clazz); void validate(Object target, Errors errors); }
  • 3. Spring MVC Validator ● Spring MVC specific ● Can not be used on client side ● All validation goes to single method ● Hard to make unit tests
  • 4. Description "This JSR will define a meta-data model and API for JavaBeanTM validation based on annotations, with overrides and extended meta-data through the use of XML validation descriptors."
  • 5. Key points ● Configured with annotations ● Not tied to a specific application tier ● Suits both server and client side
  • 6. Implementations ● Hibernate Validator (reference implementation) ● Apache Bean Validation (incubation) ● GWT Validation
  • 7. Annotation samples @Min @Future @Null @Past @NotNull @Digits @MyCustomMegaConstraint @Max @Size @Pattern
  • 8. Custom constraint sample @Target(TYPE) @Retention(RUNTIME) @Constraint(validatedBy = UniqueProductInOrderValidator.class) public @interface UniqueProductInOrder { String message() default "Only unique items"; Class<?>[] groups() default {}; Class<? extends Payload>[] payload() default {}; }
  • 9. Bean sample @UniqueProductInOrder public class Item { private String product; @Valid private Order order; @NotBlank @Length(min = 5, max = 30) public String getProduct() { return product; } }
  • 10. Validator sample public class UniqueProductInOrderValidator implements ConstraintValidator<UniqueProductInOrder, Item> { @Override public boolean isValid(Item v, ConstraintValidatorContext c) { Collection<Item> items = value.getOrder().getItems(); Set<Item> set = new HashSet<Item>(items); return set.size() == items.size(); } }
  • 11. Invoke validation sample @RequestMapping(method = POST) public String create(@Valid Item item) { orderRepository.update(item.getOrder()); return "redirect:/orders/" + item.getOrder().getId(); } @ExceptionHandler(BindException.class) public ModelAndView itemHasErrors(BindException e) { return new ModelAndView("addItem", e.getModel()); }
  • 12. Another sample @RequestMapping(value = "/orders", method = POST) public String create(@Valid Order order, BindingResult errors) { if (errors.hasErrors()) { return null; } orderRepository.save(order); return "redirect:/orders"; }
  • 13. Groups sample @GroupSequence({ Item.class, ComplexValidation.class }) @UniqueProductInOrder(groups = ComplexValidation.class) public class Item { @NotBlank private String product; } interface ComplexValidation {}
  • 14. Service layer validation public class SomeService { @Inject private Validator validator; public void doSomething(Item item) { Set<ConstraintViolation<Order>> violations = validator.validate(item); } }
  • 15. Unit test sample @Test public void noValidationErrorsWhenItemIsValid() { Item item = new Item(order, "x", 0); Validator validator = Validation.buildDefaultValidatorFactory().getValidator(); Set<ConstraintViolation<Item>> violations = validator.validate(item); assertTrue(violations.isEmpty()); }
  • 16. Single property unit test sample @Test public void nullProductIsNotAllowed() { Item item = new Item(order, null, 0); Validator validator = Validation.buildDefaultValidatorFactory().getValidator(); Set<ConstraintViolation<Item>> violations = validator.validateProperty(item, "product"); assertFalse(violations.isEmpty()); }
  • 17. Hibernate Validator Annotation Processor Annotation processor based on JSR-269 which plugs into the build process and raises compilation errors whenever constraint annotations are incorrectly used.