| |
| Standard JSR 303 defines a set of annotations and APIs to validate our domain objects at field-level. Wicket has introduced an experimental support for this standard since version 6.4.0 and with version 6.14.0 it has became an official Wicket module (named _wicket-bean-validation_). |
| In this paragraph we will see the basic steps needed to use JSR 303 validation in our Wicket application. Code snippets are from example project _JSR303validation_. |
| |
| In the example application we have a form to insert the data for a new _Person_ bean and its relative _Address_. The code for class _Person_ is the following |
| |
| [source,java] |
| ---- |
| public class Person implements Serializable{ |
| |
| @NotNull |
| private String name; |
| |
| //regular expression to validate an email address |
| @Pattern(regexp = "^[_A-Za-z0-9-]+(.[_A-Za-z0-9-]+)*[A-Za-z0-9-]+(.[A-Za-z0-9-]+)*((.[A-Za-z]{2,}){1}$)") |
| private String email; |
| |
| @Range(min = 18, max = 150) |
| private int age; |
| |
| @Past @NotNull |
| private Date birthDay; |
| |
| @NotNull |
| private Address address; |
| } |
| ---- |
| |
| You can note the JSR 303 annotations used in the code above to declare validation constraints on class fields. Class _Address_ has the following code: |
| |
| [source,java] |
| ---- |
| public class Address implements Serializable { |
| |
| @NotNull |
| private String city; |
| |
| @NotNull |
| private String street; |
| |
| @Pattern(regexp = "\\d+", message = "{address.invalidZipCode}") |
| private String zipCode; |
| } |
| ---- |
| |
| You might have noted that in class _Address_ we have used annotation _Pattern using also attribute _message_ which contains the key of the bundle to use for validation message. Our custom bundle is contained inside _HomePage.properties_: |
| |
| [source,java] |
| ---- |
| address.invalidZipCode=The inserted zip code is not valid. |
| ---- |
| |
| To tell Wicket to use JSR 303, we must register bean validator on Application's startup: |
| |
| [source,java] |
| ---- |
| public class WicketApplication extends WebApplication { |
| @Override |
| public void init(){ |
| super.init(); |
| |
| new BeanValidationConfiguration().configure(this); |
| } |
| } |
| ---- |
| |
| The last step to harness JSR 303 annotations is to add validator _org.apache.wicket.bean.validation.PropertyValidator_ to our corresponding form components: |
| |
| [source,java] |
| ---- |
| public HomePage(final PageParameters parameters) { |
| super(parameters); |
| |
| setDefaultModel(new CompoundPropertyModel<Person>(new Person())); |
| |
| Form<Void> form = new Form<Void>("form"); |
| |
| form.add(new TextField("name").add(new PropertyValidator())); |
| form.add(new TextField("email").add(new PropertyValidator())); |
| form.add(new TextField("age").add(new PropertyValidator())); |
| //... |
| } |
| ---- |
| |
| Now we can run our application an see that JSR 303 annotations are fully effective: |
| |
| image::../img/jsr303-form-validation.png[] |
| |
| |