prev | table of contents | next |
A considerable part of the XML Schema language deals with facets, enabling the programmer to restrict the basic datatypes. We have seen that the JAXB compiler doesn't care much about these facets as it just translates the basic datatype into one of Java's built-in types. A meticulous interpretation of these facets for checking that the XML data meets the constraints must be done during a schema validation.
If you want to validate your document before it is unmarshalled, JAXB lets
you request validation by passing an object of the class
javax.xml.validation.Schema
to the Unmarshaller
object. First, you create this schema object by setting up a schema
factory for the schema language of your choice. Then you create the
Schema
object by calling the factory's method
newSchema
:
Schema mySchema; SchemaFactory sf = SchemaFactory.newInstance( XMLConstants.W3C_XML_SCHEMA_NS_URI ); try { mySchema = sf.newSchema( file ); } catch( SAXException saxe ){ // ...(error handling) mySchema = null; }After the
Unmarshaller
object has been established, you
pass it the schema.
JAXBContext jc = JAXBContext.newInstance( packagePath ); Unmarshaller u = jc.createUnmarshaller(); u.setSchema( mySchema );Basically that's all there is to it. If the XML data validation fails, an
UnmarshalException
(from javax.xml.bind
) is
thrown. Make sure to let the user of your program see the exception message
so that the problem can be fixed. If you'd like to create your own error
messages, you can pass a ValidationEventCollector
to
the unmarshaller which will store validation events into it so that you
can retrieve an event and query its individual attributes. Insert
these lines before you call the unmarshal
method:
ValidationEventCollector = new ValidationEventCollector(); u.setEventHandler( vec );The best place for checking the event collector is in the
finally
phrase of the try statement wrapping all of this:
if( vec != null && vec.hasEvents() ){ for( ValidationEvent ve: vec.getEvents() ){ String msg = ve.getMessage(); ValidationEventLocator vel = ve.getLocator(); int line = vel.getLineNumber(); int column = vel.getColumnNumber(); System.err.println( origin + ": " + line + "." + column + ": " + msg ); } }Now this looks as if the validation process would be kind enough to present you with all the errors in your XML document, or at least as many as possible but, alas, it appears that the validation process throws an exception as soon as the first deviation is detected. If you want to continue as long as possible, you'll have to catch all errors with a
ValidationEventHandler
, as explained in the next section.
prev | table of contents | next |