OVal – validate your models quickly and effortlessly!

Some time ago one of the projects at work required me to validate some Java POJOs. Theses were my model classes and I’ve been creating them from incoming WebService requests. One would say that XSD would be sufficient for the task, for parts of this va…Some time ago one of the projects at work required me to validate some Java POJOs. Theses were my model classes and I’ve been creating them from incoming WebService requests. One would say that XSD would be sufficient for the task, for parts of this va…

Some time ago one of the projects at work required me to validate some Java POJOs. Theses were my model classes and I’ve been creating them from incoming WebService requests. One would say that XSD would be sufficient for the task, for parts of this validations – sure, it would. But there were some advanced rules XSD would not handle, or would render the schema document very complicated.

Rules I needed to express were like:

  • person’s first_name and last_name should be of appropriate length – between 2 and 20, and additionally one could pass a zero-length string just to remove the previous value
  • state field should consist only defined values – as in dictionary value – this one would be completable with XSD’s enumerations, but would require often changing schema files and redistributing them to interested parties :(

The library I’ve decided to use for this task is OVal and it came out really nice! Read on to find out the details!

Oval is quite mature library that allows POJO validation, but is not JSR303 (bean validation) implementation. It has converters that enable it to understand those annotations, but I’m not sure about the compatibility.

I’ve tried only a subset of the available checks, among which were:

  • NotNull
  • NotEmpty
  • Length

There are many more, and their attributes give interesting ways to configure the validation process. But using them was rather easy and did not require to much brainstorming. What I really needed were custom checks. And in this area OVal shows it’s strength. Implementing a check is really easy.

I needed an annotation that would check a field against some values in a dictionary. If field’s value was in the given set, than the validation would succeed, if not, an exception would be thrown. To accomplish this task it is required to implement two classes: annotation class and check class – called by the validation engine on a given field.

Let’s start with our new annotation:

 

In the above snippet I’ve defined a check-annotation, that would be used like this:

 

You can pass file – containing dictionary values for this field. There is also message field in the annotation which is an error message returned by the validation engine of failed check – pretty handy. And can be expressed in .properties file as:

 

Placeholder, like context, will be replaced with correct values supplied by the validation engine.

Annotating a field is not enough. It is also needed to create a validator for this kind of check. The name of the class is already defined in DictionaryValue annotation, it is called DictionaryValueCheck and I’ve done this check this way:

 

What this basically does is:

  1. when file is set – read dictionary content from the file into map
  2. upon check request just lookup value in dictionary parsed from the input file

And that’s it!

For me Oval is really great tool. With it at ones disposal it is extremely easy to create any imaginable validation you need. This library is really easy to use and offers lots of handy features.

But perhaps I’m reinventing the wheel and all this can be done easily with some other library? Share Your opinion!

You May Also Like

Spring Security by example: OpenID (login via gmail)

This is a part of a simple Spring Security tutorial: 1. Set up and form authentication 2. User in the backend (getting logged user, authentication, testing) 3. Securing web resources 4. Securing methods 5. OpenID (login via gmail) 6. OAuth2 (login v...This is a part of a simple Spring Security tutorial: 1. Set up and form authentication 2. User in the backend (getting logged user, authentication, testing) 3. Securing web resources 4. Securing methods 5. OpenID (login via gmail) 6. OAuth2 (login v...

Need to make a quick json fixes – JSONPath for rescue

From time to time I have a need to do some fixes in my json data. In a world of flat files I do this with grep/sed/awk tool chain. How to handle it for JSON? Searching for a solution I came across the JSONPath. It quite mature tool (from 2007) but I haven't hear about it so I decided to share my experience with others.

First of all you can try it without pain online: http://jsonpath.curiousconcept.com/. Full syntax is described at http://goessner.net/articles/JsonPath/



But also you can download python binding and run it from command line:
$ sudo apt-get install python-jsonpath-rw
$ sudo apt-get install python-setuptools
$ sudo easy_install -U jsonpath

After that you can use inside python or with simple cli wrapper:
#!/usr/bin/python
import sys, json, jsonpath

path = sys.argv[
1]

result = jsonpath.jsonpath(json.load(sys.stdin), path)
print json.dumps(result, indent=2)

… you can use it in your shell e.g. for json:
{
"store": {
"book": [
{
"category": "reference",
"author": "Nigel Rees",
"title": "Sayings of the Century",
"price": 8.95
},
{
"category": "fiction",
"author": "Evelyn Waugh",
"title": "Sword of Honour",
"price": 12.99
},
{
"category": "fiction",
"author": "Herman Melville",
"title": "Moby Dick",
"isbn": "0-553-21311-3",
"price": 8.99
},
{
"category": "fiction",
"author": "J. R. R. Tolkien",
"title": "The Lord of the Rings",
"isbn": "0-395-19395-8",
"price": 22.99
}
],
"bicycle": {
"color": "red",
"price": 19.95
}
}
}

You can print only book nodes with price lower than 10 by:
$ jsonpath '$..book[?(@.price 

Result:
[
{
"category": "reference",
"price": 8.95,
"title": "Sayings of the Century",
"author": "Nigel Rees"
},
{
"category": "fiction",
"price": 8.99,
"title": "Moby Dick",
"isbn": "0-553-21311-3",
"author": "Herman Melville"
}
]

Have a nice JSON hacking!From time to time I have a need to do some fixes in my json data. In a world of flat files I do this with grep/sed/awk tool chain. How to handle it for JSON? Searching for a solution I came across the JSONPath. It quite mature tool (from 2007) but I haven't hear about it so I decided to share my experience with others.