Weitere ähnliche Inhalte
Ähnlich wie Declarative input validation with JSR 303 and ExtVal (20)
Kürzlich hochgeladen (20)
Declarative input validation with JSR 303 and ExtVal
- 2. © COPYRIGHT TRANSFER SOLUTIONS B.V. 2
Who am I?
Bart Kummel
Nearly 10 years experience
in software development
Of which 5 years in Java EE
Consultant @ Transfer Solutions
Competence Manager Java EE
@ Transfer Solutions
Author of Apache MyFaces 1.2
Web Application Development
See http://tinyurl.com/am12wad
- 3. © COPYRIGHT TRANSFER SOLUTIONS B.V. 3Photo: Salar de Uyuni, Bolivia; © 2010 by Bart KummelPhoto: Salar de Uyuni, Bolivia; © 2010 by Bart Kummel
- 4. © COPYRIGHT TRANSFER SOLUTIONS B.V. 4
Don’t Repeat Yourself
Less code = less bugs
Duplicated code = duplicated bugs
Duplicated code = duplicated maintenance
Dupliacted maintenance = forgotten maintenance
- 5. © COPYRIGHT TRANSFER SOLUTIONS B.V. 5
DRY violations in classic Java EE apps
Validation is programmed in Model beans
Because that’s where it belongs
Validation is repeated in View layer
Because you have to use JSF Validators
Validation is even repeated multiple times in the View
Because the same bean is used in multiple JSF pages
- 6. © COPYRIGHT TRANSFER SOLUTIONS B.V. 6
Remove validation code from View
Let View generate validation based on Model
Let’s fix this
How to fix it?
That’s why Bean Validation (JSR 303) was created
- 7. © COPYRIGHT TRANSFER SOLUTIONS B.V. 7
JSR 303: the idea
Standardized way to express validation constraints
Any UI technology can interpret those constraints
and enforce them
Non-UI technologies can also use the validation
information
- 8. © COPYRIGHT TRANSFER SOLUTIONS B.V. 8
JSR 303: the idea implemented
JSR 303 is part of Java EE 6
The reference implementation is
Hibernate Validator 4.*
See http://hibernate.org/subprojects/validator.html
Hibernate Validator 4.* can also be used in Java EE 5
A JSR 303 implementation is only the way
to express the validation constraints
You don’t get UI validation logic if the UI framework
doesn’t support JSR 303
- 9. © COPYRIGHT TRANSFER SOLUTIONS B.V. 9
Bean Validation in Java EE 5
Add Hibernate Validator 4.* as library
...and some extra libraries, provided in the Hibernate
Validator package
Use JSR 303 annotations in your beans
Use MyFaces ExtVal 1.2.* to add declarative
validation support to JSF 1.2
- 10. © COPYRIGHT TRANSFER SOLUTIONS B.V. 10
Bean Validation in Java EE 6
No need to add a JSR 303 implementation
JSR 303 is part of the Java EE 6 platform
Use JSR 303 annotations in your beans
JSF 2.0 has support for JSR 303 annotations out of the
box
But support is limited
You can (and should!) still use ExtVal (2.0.*) and get
lots of benefits (more on that later)
- 11. © COPYRIGHT TRANSFER SOLUTIONS B.V. 11
Side note: ExtVal versioning
There are three current versions of ExtVal
1.1.* for JSF 1.1
1.2.* for JSF 1.2
2.0.* for JSF 2.0
The latest stable release is release 3
That is: 1.1.3, 1.2.3 and 2.0.3
Lots of exciting new stuff is going into the next
version
Snapshot releases of ExtVal are very high quality
- 12. © COPYRIGHT TRANSFER SOLUTIONS B.V. 12
Example: classic validation code in bean
@Min(0)
@Max(100000)
private int capacity;
public void setCapacity(int capacity) {
if(capacity >= 0 && capacity <= 100000) {
this.capacity = capacity;
} else {
// throw exception
}
}
- 13. © COPYRIGHT TRANSFER SOLUTIONS B.V. 13
Example: JSR 303 annotations
@Min(0)
@Max(100000)
private int capacity;
public void setCapacity(int capacity) {
this.capacity = capacity;
}
Extra benefits:
– less code
– better readable
- 14. © COPYRIGHT TRANSFER SOLUTIONS B.V. 14
Example: classic validation in JSF page
<h:inputText value="#{room.capacity}" >
<f:validateLongRange minimum = "0"
maximum = "100000" />
</h:inputText>
- 15. © COPYRIGHT TRANSFER SOLUTIONS B.V. 15
Example: no validation in JSF page!
<h:inputText value="#{room.capacity}" />
Benefits:
– less code
– DRY!
- 17. © COPYRIGHT TRANSFER SOLUTIONS B.V. 17
So why do we need ExtVal?
To use Bean Validation in Java EE 5 / JSF 1.2
To have advanced options in Java EE 6
- 18. © COPYRIGHT TRANSFER SOLUTIONS B.V. 18
ExtVal on Java EE 6: advanced options
Cross validation
Violation severity
i.o.w. give warnings instead of errors
More flexibility in choice of annotations to use
JSR 303, JPA, ExtVal, own annotation or any combination
Customization on all levels, e.g.:
Custom message resolvers
Custom validation strategies
Custom meta data
demos
coming
up!
- 19. © COPYRIGHT TRANSFER SOLUTIONS B.V. 19
Configuring ExtVal
Just add the ExtVal .jar files to your project
- 21. © COPYRIGHT TRANSFER SOLUTIONS B.V. 21
Cross validation
Examples of cross validation
check if two values are equal
check if date is before or after other date
value is only required if other value is empty (or not)
etcetera...
- 23. © COPYRIGHT TRANSFER SOLUTIONS B.V. 23
Demo 3 – Summary
@DateIs can be used for date-related cross
validations
Use DateIsType.before, DateIsType.after or
DateIsType.same
Other cross validation annotations:
@Equals and @NotEquals for equality-based cross
validation of any type
@RequiredIf for conditional required fields
Use RequiredIfType.empty or
RequiredIfType.not_empty
- 24. © COPYRIGHT TRANSFER SOLUTIONS B.V. 24
Violation severity
Give certain validation rules a severity level of
“warning”
A warning will be given to the user, but “invalid” data
can be submitted
- 26. © COPYRIGHT TRANSFER SOLUTIONS B.V. 26
Demo 4 – summary
Violation severity is not part of the JSR 303 standard
We use payload to add violation severity level as custom
meta data
JPA also interprets JSR 303 contraints before
persisting data, but does not recognise violation
severity
Solution: use ExtVal annotations instead
- 27. © COPYRIGHT TRANSFER SOLUTIONS B.V. 27
Customization on all levels
ExtVal is full of customization hooks
A lot of ready-made add-ons are available
see http://os890.blogspot.com
- 29. © COPYRIGHT TRANSFER SOLUTIONS B.V. 29
Demo 5 – summary
Technically, creating a custom annotation is not an
ExtVal feature
It is just a Java feature
We need an ExtVal validation strategy to make a
custom annotation work
We need to map our annotation to our validation
strategy
We can create a startup listener for this
As an alternative we can use ExtVal plugins to use
alternative ways of configuration
- 30. © COPYRIGHT TRANSFER SOLUTIONS B.V. 30
Summary
With annotation based valition, we can
finally create DRY JSF applications
ExtVal gives us the opportunity to use
annotation-based validation on Java EE 5
On Java EE 6, ExtVal gives us:
More powerful annotation-based validation
More flexibility
- 31. © COPYRIGHT TRANSFER SOLUTIONS B.V. 31
More info...
I will put links to slides & demo code on my blog
http://www.bartkummel.net
Chapter 10 of MyFaces 1.2
Web Application Development
http://tinyurl.com/am12wad
MyFaces ExtVal:
http://myfaces.apache.org/extensions/validator
http://os890.blogspot.com/
- 32. © COPYRIGHT TRANSFER SOLUTIONS B.V. 32
&Q u e s t i o n s
A n s w e r s
CONSULTING | MANAGED SERVICES | EDUCATION
WWW.TRANSFER-SOLUTIONS.COM