You can implement a validator for a single property or a validator that takes multiple properties into account when computing issues. Single-property validators are generally more reusable across document types and across projects and should cover the vast majority of use cases.
For a single-property validator, you can implement the interface
PropertyValidator
of the package com.coremedia.rest.validation
. The
easiest way of doing this is by inheriting from the class
ObjectPropertyValidatorBase
and implementing the method
isValid(Object)
.
public class MyValidator extends ObjectPropertyValidatorBase { @Override protected boolean isValid(Object value) { return ...; } }
Example 7.59. Implementing a property validator
If you know that all property values belong to a given Java class, you can inherit from
PropertyValidatorBase
instead, specifying the value type as the generic type
argument of the base class and passing a class object of the value class to the base class's
constructor. You can then implement a more specific isValid
method that
immediately receives an argument of the correct type.
To enable a property validator, you register it in a content type validator that is defined in
the Spring application context. The following code snippet shows how the validator is applied
to the property myProperty
of the document type MyDocumentType
. Here
the validator is configured to apply to all subtypes of the given document type, too. By
default, the validator would only apply to exactly the given document type.
<bean parent="contentTypeValidator"> <property name="contentType" value="MyDocumentType"/> <property name="validatingSubtypes" value="true"/> <property name="validators"> <list> <bean class="MyValidator"> <property name="property" value="myProperty"/> </bean> </list> </property> </bean>
Example 7.60. Configuring a property validator
See the Javadoc of the REST Service API and especially the packages
com.coremedia.rest.validators
and com.coremedia.rest.cap.validators
for the predefined validators.
For all validators that inherit from PropertyValidatorBase
, which includes all
standard validators, you can set the field code
in the Spring configuration to an
issue code of your choice. If you choose not to do so, the class name of the validator
implementation will be used as the issue code. For example, the validator
com.coremedia.rest.validators.RegExpValidator
creates issue with code
RegExpValidator
by default.
To provide multiple validators for a single document type you can either provide multiple
beans inheriting from contentTypeValidator
or, more commonly, multiple validators
in the validators
property of a single content type validator.
If you want to handle multiple properties of a content at once, your validator should inherit
from the base class ContentTypeValidatorBase
The single method to implement is
validate(Content, Issues)
, which receives the content to analyze as its first
argument and an Issues
object as its second argument. Whenever a problem is
detected, you can call the method addIssue(severity, property, code, ...)
of the
issues object to register a new issue.
public class MyContentValidator extends ContentTypeValidatorBase { @Override public void validate(Content content, Issues issues) { if (...) { issues.addIssue(Severity.ERROR, "myProperty", "myCode"); } } }
Example 7.61. Implementing a content validator
By inheriting from ContentTypeValidatorBase
you can easily specify the name of
the content type to which is validator is applied when configuring the validator into the
Spring application context.
<bean class="MyContentValidator"> <property name="connection" ref="connection"/> <property name="contentType" value="MyDocumentType"/> </bean>
Example 7.62. Configuring a content validator
You can also implement the interface CapTypeValidator
directly, if you do not
want to make use of the convenience methods of ContentTypeValidatorBase
. Finally,
by implementing com.coremedia.rest.validation.Validator<Content>
you could
create validators that are not even bound to a document type. This should only be necessary in
very rare cases.