jsr 303 from a world of constraints to constrain …...• oracle® adf • rife • spring bean...
TRANSCRIPT
![Page 1: JSR 303 From a World of Constraints to Constrain …...• Oracle® ADF • RIFE • Spring Bean Validation • Stripes • XWork Validation Google Oracle Red Hat Sun individuals](https://reader036.vdocument.in/reader036/viewer/2022081517/5ec6f124726f4b16e31d6e75/html5/thumbnails/1.jpg)
JSR 303From a World of Constraints to Constrain the WorldEmmanuel BernardLead developer, JBoss a division of Red Hat
TS-5616
![Page 2: JSR 303 From a World of Constraints to Constrain …...• Oracle® ADF • RIFE • Spring Bean Validation • Stripes • XWork Validation Google Oracle Red Hat Sun individuals](https://reader036.vdocument.in/reader036/viewer/2022081517/5ec6f124726f4b16e31d6e75/html5/thumbnails/2.jpg)
2008 JavaOneSM Conference | java.sun.com/javaone |
• Help the planet: write less code
• Express data constraints once and for all across all the layers of your application
![Page 3: JSR 303 From a World of Constraints to Constrain …...• Oracle® ADF • RIFE • Spring Bean Validation • Stripes • XWork Validation Google Oracle Red Hat Sun individuals](https://reader036.vdocument.in/reader036/viewer/2022081517/5ec6f124726f4b16e31d6e75/html5/thumbnails/3.jpg)
2008 JavaOneSM Conference | java.sun.com/javaone |
Agenda
• Constraints: needs and problems• Looking at solutions• JSR 303• How to declare constraints• How to define new constraints• How to check constraints• How to query constraints
![Page 4: JSR 303 From a World of Constraints to Constrain …...• Oracle® ADF • RIFE • Spring Bean Validation • Stripes • XWork Validation Google Oracle Red Hat Sun individuals](https://reader036.vdocument.in/reader036/viewer/2022081517/5ec6f124726f4b16e31d6e75/html5/thumbnails/4.jpg)
2008 JavaOneSM Conference | java.sun.com/javaone |
Constraints
• Constraint• Restriction on a bean, field or property• Not null, between 10 and 45, valid email...
• How is that useful• Give feedback to the user• Ensure that a service will behave correctly
• define service range of usability• Avoid adding crap to the database
• unless you like fixing the data manually
![Page 5: JSR 303 From a World of Constraints to Constrain …...• Oracle® ADF • RIFE • Spring Bean Validation • Stripes • XWork Validation Google Oracle Red Hat Sun individuals](https://reader036.vdocument.in/reader036/viewer/2022081517/5ec6f124726f4b16e31d6e75/html5/thumbnails/5.jpg)
2008 JavaOneSM Conference | java.sun.com/javaone | 5
Constraints in the Java Technology Ecosystem• Where should they be applied
• How many model do I have?• 1
![Page 6: JSR 303 From a World of Constraints to Constrain …...• Oracle® ADF • RIFE • Spring Bean Validation • Stripes • XWork Validation Google Oracle Red Hat Sun individuals](https://reader036.vdocument.in/reader036/viewer/2022081517/5ec6f124726f4b16e31d6e75/html5/thumbnails/6.jpg)
2008 JavaOneSM Conference | java.sun.com/javaone | 6
How are they applied
• Database schema
• Business / Service level
create table Document (id bigint not null primary keytitle varchar(30) not null,summary varchar(255),content varchar(255))
if ( document.getTitle() == null || document.getTitle().length() > 30 ) {throw new BusinessException(“Document title”+ “ invalid”);}
![Page 7: JSR 303 From a World of Constraints to Constrain …...• Oracle® ADF • RIFE • Spring Bean Validation • Stripes • XWork Validation Google Oracle Red Hat Sun individuals](https://reader036.vdocument.in/reader036/viewer/2022081517/5ec6f124726f4b16e31d6e75/html5/thumbnails/7.jpg)
2008 JavaOneSM Conference | java.sun.com/javaone | 7
How are they applied• Presentation level
• or some XML constraint declaration from your web framework• Client side
//Your favorite DHTML + javascript library//or//Your favorite JSF component library//or//Your favorite other web framework
if ( documentForm.getTitle() == null || documentForm.getTitle().length() > 30 ) {throw new BusinessException(“Document title”+ “ invalid”);}
![Page 8: JSR 303 From a World of Constraints to Constrain …...• Oracle® ADF • RIFE • Spring Bean Validation • Stripes • XWork Validation Google Oracle Red Hat Sun individuals](https://reader036.vdocument.in/reader036/viewer/2022081517/5ec6f124726f4b16e31d6e75/html5/thumbnails/8.jpg)
2008 JavaOneSM Conference | java.sun.com/javaone | 8
So what is the problem?
Duplication• Multiple declarations of the same constraint• Code duplication• Risk of inconsistency
• Multiple runtime checking• Not all constraints can be expressed by all engines• Slightly different semantic?
![Page 9: JSR 303 From a World of Constraints to Constrain …...• Oracle® ADF • RIFE • Spring Bean Validation • Stripes • XWork Validation Google Oracle Red Hat Sun individuals](https://reader036.vdocument.in/reader036/viewer/2022081517/5ec6f124726f4b16e31d6e75/html5/thumbnails/9.jpg)
2008 JavaOneSM Conference | java.sun.com/javaone | 9
What is the solution?
Uniform way to express a constraint• Everybody speaks the same language• Based on the domain model (JavaBeans™ architecture)
• Standard way to validate constraints• One runtime• Same validation implementations shared
• Bridge for constraints out of Java technology land• API to access the constraint repository
![Page 10: JSR 303 From a World of Constraints to Constrain …...• Oracle® ADF • RIFE • Spring Bean Validation • Stripes • XWork Validation Google Oracle Red Hat Sun individuals](https://reader036.vdocument.in/reader036/viewer/2022081517/5ec6f124726f4b16e31d6e75/html5/thumbnails/10.jpg)
2008 JavaOneSM Conference | java.sun.com/javaone | 10
Expressing the constraint
• In the JavaDoc™?
• Nobody reads it...
public class Address {/** * cannot be null * and must be lower than 30 chars */private String street1;private String street2;...
![Page 11: JSR 303 From a World of Constraints to Constrain …...• Oracle® ADF • RIFE • Spring Bean Validation • Stripes • XWork Validation Google Oracle Red Hat Sun individuals](https://reader036.vdocument.in/reader036/viewer/2022081517/5ec6f124726f4b16e31d6e75/html5/thumbnails/11.jpg)
2008 JavaOneSM Conference | java.sun.com/javaone | 11
Expressing the constraint
In your code?public class Address {
private String street1;private String street2;...
public void invariant() {if (street1 == null)
throw new IllegalStateException("street1 cannot be null");
if (street1.length() > 30) throw new IllegalStateException("street1
must not be longer than 30 characters");}...
![Page 12: JSR 303 From a World of Constraints to Constrain …...• Oracle® ADF • RIFE • Spring Bean Validation • Stripes • XWork Validation Google Oracle Red Hat Sun individuals](https://reader036.vdocument.in/reader036/viewer/2022081517/5ec6f124726f4b16e31d6e75/html5/thumbnails/12.jpg)
2008 JavaOneSM Conference | java.sun.com/javaone | 12
Expressing the constraint
In XML?<constraints>
<bean name="com.jboss.example.jsr303.Address"><field name="street1">
<constraint class="org.jboss.constraints.NotNull"/>
<constraint class="org.jboss.constraints.Length">
<param name="max">30</param><param name="message">street1 longer
than 30 characters</param></constraint>
</field>...
</bean></constraints>
![Page 13: JSR 303 From a World of Constraints to Constrain …...• Oracle® ADF • RIFE • Spring Bean Validation • Stripes • XWork Validation Google Oracle Red Hat Sun individuals](https://reader036.vdocument.in/reader036/viewer/2022081517/5ec6f124726f4b16e31d6e75/html5/thumbnails/13.jpg)
2008 JavaOneSM Conference | java.sun.com/javaone | 13
Expressing the constraint: annotations
Using annotations• Metadata at the language• Next to the class definition
public class Address {@NotNull @Length(max=30, message="longer than {max} characters")private String street1;private String street2;...
}
![Page 14: JSR 303 From a World of Constraints to Constrain …...• Oracle® ADF • RIFE • Spring Bean Validation • Stripes • XWork Validation Google Oracle Red Hat Sun individuals](https://reader036.vdocument.in/reader036/viewer/2022081517/5ec6f124726f4b16e31d6e75/html5/thumbnails/14.jpg)
2008 JavaOneSM Conference | java.sun.com/javaone | 14
JSR 303
• Standardize constraint declarations• Annotations (and XML)• Custom constraints
• Standardize the Validation API• Layer agnostic• i18n• Extension points
• Standardize a metadata request API• Integration point for other JSRs/frameworks• Outside the Java technology world
![Page 15: JSR 303 From a World of Constraints to Constrain …...• Oracle® ADF • RIFE • Spring Bean Validation • Stripes • XWork Validation Google Oracle Red Hat Sun individuals](https://reader036.vdocument.in/reader036/viewer/2022081517/5ec6f124726f4b16e31d6e75/html5/thumbnails/15.jpg)
2008 JavaOneSM Conference | java.sun.com/javaone | 15
JSR 303 Members
• Apache commons validator• Hibernate Validator• JavaServer Faces (JSF)• Oracle® ADF• RIFE• Spring Bean Validation• Stripes• XWork Validation
GoogleOracleRed HatSunindividuals
![Page 16: JSR 303 From a World of Constraints to Constrain …...• Oracle® ADF • RIFE • Spring Bean Validation • Stripes • XWork Validation Google Oracle Red Hat Sun individuals](https://reader036.vdocument.in/reader036/viewer/2022081517/5ec6f124726f4b16e31d6e75/html5/thumbnails/16.jpg)
2008 JavaOneSM Conference | java.sun.com/javaone | 16
How to express a constraint
Annotation based• Annotate the target (bean, field, getter)
• Annotation members• Message• Groups• And custom parameters
![Page 17: JSR 303 From a World of Constraints to Constrain …...• Oracle® ADF • RIFE • Spring Bean Validation • Stripes • XWork Validation Google Oracle Red Hat Sun individuals](https://reader036.vdocument.in/reader036/viewer/2022081517/5ec6f124726f4b16e31d6e75/html5/thumbnails/17.jpg)
2008 JavaOneSM Conference | java.sun.com/javaone | 17
Validating an object graph
Cascaded constraint checkingpublic class Address {
@NotNull @Length(max=30, message="longer than {max} characters")private String street1;...@NotNull @Validprivate Country country;
}
public class Country {@NotNull @Length(max=30) private String name;...
}
![Page 18: JSR 303 From a World of Constraints to Constrain …...• Oracle® ADF • RIFE • Spring Bean Validation • Stripes • XWork Validation Google Oracle Red Hat Sun individuals](https://reader036.vdocument.in/reader036/viewer/2022081517/5ec6f124726f4b16e31d6e75/html5/thumbnails/18.jpg)
2008 JavaOneSM Conference | java.sun.com/javaone | 18
Expressing constraints
Multiple declarations of the same constraint• @Patterns ( { @Pattern(regexp=”...”) } )
• Declaration inherited• Superclass• Interfaces• Additive
![Page 19: JSR 303 From a World of Constraints to Constrain …...• Oracle® ADF • RIFE • Spring Bean Validation • Stripes • XWork Validation Google Oracle Red Hat Sun individuals](https://reader036.vdocument.in/reader036/viewer/2022081517/5ec6f124726f4b16e31d6e75/html5/thumbnails/19.jpg)
2008 JavaOneSM Conference | java.sun.com/javaone | 19
How to define a new constraint• One annotation
• One implementation
@ConstraintValidator(LengthConstraint.class)public @interface Length {
String message() default "{beanckeck.length}";String[] groups() default {};int min() default 0;int max() default Integer.MAX_VALUE;
}
public class LengthConstraint implements Constraint<Length> {
public void initialize(Length annotation) {}public boolean isValid(Object value) {}
}
![Page 20: JSR 303 From a World of Constraints to Constrain …...• Oracle® ADF • RIFE • Spring Bean Validation • Stripes • XWork Validation Google Oracle Red Hat Sun individuals](https://reader036.vdocument.in/reader036/viewer/2022081517/5ec6f124726f4b16e31d6e75/html5/thumbnails/20.jpg)
2008 JavaOneSM Conference | java.sun.com/javaone | 20
How to define a new constraint
• Static dimensions• Extend metadata beyond the Java world
• List of dimensions• Nullability• Precision• Scale• Length
• Extension point
![Page 21: JSR 303 From a World of Constraints to Constrain …...• Oracle® ADF • RIFE • Spring Bean Validation • Stripes • XWork Validation Google Oracle Red Hat Sun individuals](https://reader036.vdocument.in/reader036/viewer/2022081517/5ec6f124726f4b16e31d6e75/html5/thumbnails/21.jpg)
2008 JavaOneSM Conference | java.sun.com/javaone |
Possible constraintsBut you can write your own!
• Logic• @NotNull• @NotEmpty• @AssertTrue / False
• Business• @Email• @EAN• @CreditCard
Range• @Min / @Max• @Digits• @Length• @Size
• Other• @Valid• @Pattern
![Page 22: JSR 303 From a World of Constraints to Constrain …...• Oracle® ADF • RIFE • Spring Bean Validation • Stripes • XWork Validation Google Oracle Red Hat Sun individuals](https://reader036.vdocument.in/reader036/viewer/2022081517/5ec6f124726f4b16e31d6e75/html5/thumbnails/22.jpg)
2008 JavaOneSM Conference | java.sun.com/javaone | 22
Validate an object (graph)
• Validate a bean
• Or more fine grained
• Returns invalid constraints• Invalid value• Internationalized message• Invalid root bean• Path to the failing property
Set<InvalidConstraint> errors = addressValidator.validate(address);
![Page 23: JSR 303 From a World of Constraints to Constrain …...• Oracle® ADF • RIFE • Spring Bean Validation • Stripes • XWork Validation Google Oracle Red Hat Sun individuals](https://reader036.vdocument.in/reader036/viewer/2022081517/5ec6f124726f4b16e31d6e75/html5/thumbnails/23.jpg)
2008 JavaOneSM Conference | java.sun.com/javaone | 23
Message
• Can be externalized• i18n• interpolate constraint parameters
• Must not be shorter than {min}• Custom MessageResolver strategy
• Useful for application frameworks• Contextual data
![Page 24: JSR 303 From a World of Constraints to Constrain …...• Oracle® ADF • RIFE • Spring Bean Validation • Stripes • XWork Validation Google Oracle Red Hat Sun individuals](https://reader036.vdocument.in/reader036/viewer/2022081517/5ec6f124726f4b16e31d6e75/html5/thumbnails/24.jpg)
2008 JavaOneSM Conference | java.sun.com/javaone | 24
GroupsSubset of constraints
Partial validation• Screen of a wizard UI
• Constraints applied in a given use case• Order constraint validation
• Which depends on other validations• When a constraint is resource/time intensive
@GroupSequence(name=”total” sequence={“firstStep”, “secondStep”} )
![Page 25: JSR 303 From a World of Constraints to Constrain …...• Oracle® ADF • RIFE • Spring Bean Validation • Stripes • XWork Validation Google Oracle Red Hat Sun individuals](https://reader036.vdocument.in/reader036/viewer/2022081517/5ec6f124726f4b16e31d6e75/html5/thumbnails/25.jpg)
2008 JavaOneSM Conference | java.sun.com/javaone | 25
Constraint repository API
Expose the constraint repository• List of constraints for a JavaBean
• Useful at Java technology boundaries• Persistence (DDL)• Presentation layer (Javascript™ programming language)
• Tooling
![Page 26: JSR 303 From a World of Constraints to Constrain …...• Oracle® ADF • RIFE • Spring Bean Validation • Stripes • XWork Validation Google Oracle Red Hat Sun individuals](https://reader036.vdocument.in/reader036/viewer/2022081517/5ec6f124726f4b16e31d6e75/html5/thumbnails/26.jpg)
2008 JavaOneSM Conference | java.sun.com/javaone | 26
Who could use it?
• Java Persistence API 2.0• Database schema generation• Entity validation on change
• Web Beans (JBoss Seam)• Presentation (declaratively)• Business (declaratively)
• JSF 2.0 and AJAX libraries• RichFaces
Your code triggering validation...
![Page 27: JSR 303 From a World of Constraints to Constrain …...• Oracle® ADF • RIFE • Spring Bean Validation • Stripes • XWork Validation Google Oracle Red Hat Sun individuals](https://reader036.vdocument.in/reader036/viewer/2022081517/5ec6f124726f4b16e31d6e75/html5/thumbnails/27.jpg)
2008 JavaOneSM Conference | java.sun.com/javaone | 27
Ultimate goal
• Common constraint declaration• No duplication• Close to the code, close to the model
• Reused• Layers• Application frameworks• JSRs
• Declarative validation• Extensible
![Page 28: JSR 303 From a World of Constraints to Constrain …...• Oracle® ADF • RIFE • Spring Bean Validation • Stripes • XWork Validation Google Oracle Red Hat Sun individuals](https://reader036.vdocument.in/reader036/viewer/2022081517/5ec6f124726f4b16e31d6e75/html5/thumbnails/28.jpg)
2008 JavaOneSM Conference | java.sun.com/javaone | 28
Work in progress
• Standard dimensions• Message resolution and localization• Bootstrap strategy• Feedback on metadata request API• Built-in constraint definition• XML Deployment descriptor• Extension for method parameters validation
![Page 29: JSR 303 From a World of Constraints to Constrain …...• Oracle® ADF • RIFE • Spring Bean Validation • Stripes • XWork Validation Google Oracle Red Hat Sun individuals](https://reader036.vdocument.in/reader036/viewer/2022081517/5ec6f124726f4b16e31d6e75/html5/thumbnails/29.jpg)
2008 JavaOneSM Conference | java.sun.com/javaone |
Q&A
![Page 30: JSR 303 From a World of Constraints to Constrain …...• Oracle® ADF • RIFE • Spring Bean Validation • Stripes • XWork Validation Google Oracle Red Hat Sun individuals](https://reader036.vdocument.in/reader036/viewer/2022081517/5ec6f124726f4b16e31d6e75/html5/thumbnails/30.jpg)
2008 JavaOneSM Conference | java.sun.com/javaone |
For More Information
JCP.org (Java Community ProcessSM) • http://jcp.org/en/jsr/detail?id=303
• http://in.relation.toSearch for Bean Validation Sneek Peak
• Hibernate Validator• http://forum.hibernate.org/viewforum.php?f=26
![Page 31: JSR 303 From a World of Constraints to Constrain …...• Oracle® ADF • RIFE • Spring Bean Validation • Stripes • XWork Validation Google Oracle Red Hat Sun individuals](https://reader036.vdocument.in/reader036/viewer/2022081517/5ec6f124726f4b16e31d6e75/html5/thumbnails/31.jpg)
From a world of constraintsto constrain the worldEmmanuel Bernard
TS-5616