[[msv-component]]
= MSV Component

*Available as of Camel version 1.1*


The MSV component performs XML validation of the message body using the
https://msv.dev.java.net/[MSV Library] and any of the supported XML
schema languages, such as http://www.w3.org/XML/Schema[XML Schema] or
http://relaxng.org/[RelaxNG XML Syntax].

Maven users will need to add the following dependency to their `pom.xml`
for this component:

[source,xml]
------------------------------------------------------------
<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-msv</artifactId>
    <version>x.x.x</version>
    <!-- use the same version as your Camel core version -->
</dependency>
------------------------------------------------------------

Note that the xref:jing-component.adoc[Jing] component also supports
http://relaxng.org/compact-tutorial-20030326.html[RelaxNG Compact
Syntax]

== URI format

[source,java]
---------------------------------------
msv:someLocalOrRemoteResource[?options]
---------------------------------------

Where *someLocalOrRemoteResource* is some URL to a local resource on the
classpath or a full URL to a remote resource or resource on the file
system. For example

[source,java]
------------------------------
msv:org/foo/bar.rng
msv:file:../foo/bar.rng
msv:http://acme.com/cheese.rng
------------------------------

You can append query options to the URI in the following format,
`?option=value&option=value&...`

== Options




// component options: START
The MSV component supports 3 options, which are listed below.



[width="100%",cols="2,5,^1,2",options="header"]
|===
| Name | Description | Default | Type
| *schemaFactory* (advanced) | To use the javax.xml.validation.SchemaFactory. |  | SchemaFactory
| *resourceResolverFactory* (advanced) | To use a custom LSResourceResolver which depends on a dynamic endpoint resource URI |  | ValidatorResource ResolverFactory
| *resolveProperty Placeholders* (advanced) | Whether the component should resolve property placeholders on itself when starting. Only properties which are of String type can use property placeholders. | true | boolean
|===
// component options: END






// endpoint options: START
The MSV endpoint is configured using URI syntax:

----
msv:resourceUri
----

with the following path and query parameters:

=== Path Parameters (1 parameters):


[width="100%",cols="2,5,^1,2",options="header"]
|===
| Name | Description | Default | Type
| *resourceUri* | *Required* URL to a local resource on the classpath, or a reference to lookup a bean in the Registry, or a full URL to a remote resource or resource on the file system which contains the XSD to validate against. |  | String
|===


=== Query Parameters (11 parameters):


[width="100%",cols="2,5,^1,2",options="header"]
|===
| Name | Description | Default | Type
| *failOnNullBody* (producer) | Whether to fail if no body exists. | true | boolean
| *failOnNullHeader* (producer) | Whether to fail if no header exists when validating against a header. | true | boolean
| *headerName* (producer) | To validate against a header instead of the message body. |  | String
| *errorHandler* (advanced) | To use a custom org.apache.camel.processor.validation.ValidatorErrorHandler. The default error handler captures the errors and throws an exception. |  | ValidatorErrorHandler
| *resourceResolver* (advanced) | To use a custom LSResourceResolver. Do not use together with resourceResolverFactory |  | LSResourceResolver
| *resourceResolverFactory* (advanced) | To use a custom LSResourceResolver which depends on a dynamic endpoint resource URI. The default resource resolver factory resturns a resource resolver which can read files from the class path and file system. Do not use together with resourceResolver. |  | ValidatorResource ResolverFactory
| *schemaFactory* (advanced) | To use a custom javax.xml.validation.SchemaFactory |  | SchemaFactory
| *schemaLanguage* (advanced) | Configures the W3C XML Schema Namespace URI. | http://www.w3.org/2001/XMLSchema | String
| *synchronous* (advanced) | Sets whether synchronous processing should be strictly used, or Camel is allowed to use asynchronous processing (if supported). | false | boolean
| *useDom* (advanced) | Whether DOMSource/DOMResult or SaxSource/SaxResult should be used by the validator. | false | boolean
| *useSharedSchema* (advanced) | Whether the Schema instance should be shared or not. This option is introduced to work around a JDK 1.6.x bug. Xerces should not have this issue. | true | boolean
|===
// endpoint options: END
// spring-boot-auto-configure options: START
== Spring Boot Auto-Configuration

When using Spring Boot make sure to use the following Maven dependency to have support for auto configuration:

[source,xml]
----
<dependency>
  <groupId>org.apache.camel</groupId>
  <artifactId>camel-msv-starter</artifactId>
  <version>x.x.x</version>
  <!-- use the same version as your Camel core version -->
</dependency>
----


The component supports 4 options, which are listed below.



[width="100%",cols="2,5,^1,2",options="header"]
|===
| Name | Description | Default | Type
| *camel.component.msv.enabled* | Enable msv component | true | Boolean
| *camel.component.msv.resolve-property-placeholders* | Whether the component should resolve property placeholders on itself when starting. Only properties which are of String type can use property placeholders. | true | Boolean
| *camel.component.msv.resource-resolver-factory* | To use a custom LSResourceResolver which depends on a dynamic endpoint resource URI. The option is a org.apache.camel.component.validator.ValidatorResourceResolverFactory type. |  | String
| *camel.component.msv.schema-factory* | To use the javax.xml.validation.SchemaFactory. The option is a javax.xml.validation.SchemaFactory type. |  | String
|===
// spring-boot-auto-configure options: END




== Example

The following
https://github.com/apache/camel/blob/master/components/camel-msv/src/test/resources/org/apache/camel/component/validator/msv/camelContext.xml[example]
shows how to configure a route from endpoint *direct:start* which then
goes to one of two endpoints, either *mock:valid* or *mock:invalid*
based on whether or not the XML matches the given
http://relaxng.org/[RelaxNG XML Schema] (which is supplied on the
classpath).