[[json-validator-component]]
== JSON Schema Validator Component

*Available as of Camel version 2.20*

The JSON Schema Validator component performs bean validation of the message body
against JSON Schemas v4 draft using the NetworkNT JSON Schema library
(https://github.com/networknt/json-schema-validator).

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-json-validator</artifactId>
    <version>x.y.z</version>
    <!-- use the same version as your Camel core version -->
</dependency>
----


=== URI format

[source]
----
json-validator:resourceUri[?options]
----


Where *resourceUri* is some URL to a local resource on the classpath or a 
full URL to a remote resource or resource on the file system which contains 
the JSON Schema to validate against.
 
=== URI Options

// component options: START
The JSON Schema Validator component has no options.
// component options: END



// endpoint options: START
The JSON Schema Validator endpoint is configured using URI syntax:

----
json-validator: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* Path to the resource. You can prefix with: classpath, file, http, ref, or bean. classpath, file and http loads the resource using these protocols (classpath is default). ref will lookup the resource in the registry. bean will call a method on a bean to be used as the resource. For bean you can specify the method name after dot, eg bean:myBean.myMethod. |  | String
|===


==== Query Parameters (7 parameters):


[width="100%",cols="2,5,^1,2",options="header"]
|===
| Name | Description | Default | Type
| *contentCache* (producer) | Sets whether to use resource content cache or not | false | boolean
| *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 ValidatorErrorHandler. The default error handler captures the errors and throws an exception. |  | JsonValidatorError Handler
| *schemaLoader* (advanced) | To use a custom schema loader allowing for adding custom format validation. The default implementation will create a schema loader with draft v4 support. |  | JsonSchemaLoader
| *synchronous* (advanced) | Sets whether synchronous processing should be strictly used, or Camel is allowed to use asynchronous processing (if supported). | false | 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-json-validator-starter</artifactId>
  <version>x.x.x</version>
  <!-- use the same version as your Camel core version -->
</dependency>
----


The component supports 2 options, which are listed below.



[width="100%",cols="2,5,^1,2",options="header"]
|===
| Name | Description | Default | Type
| *camel.component.json-validator.enabled* | Whether to enable auto configuration of the json-validator component. This is enabled by default. |  | Boolean
| *camel.component.json-validator.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
|===
// spring-boot-auto-configure options: END



=== Example

Assumed we have the following JSON Schema

*myschema.json*

[source,json]
----
{
  "$schema": "http://json-schema.org/draft-04/schema#", 
  "definitions": {}, 
  "id": "my-schema",
  "properties": {
    "id": {
      "default": 1, 
      "description": "An explanation about the purpose of this instance.", 
      "id": "/properties/id", 
      "title": "The id schema", 
      "type": "integer"
    }, 
    "name": {
      "default": "A green door", 
      "description": "An explanation about the purpose of this instance.", 
      "id": "/properties/name", 
      "title": "The name schema", 
      "type": "string"
    }, 
    "price": {
      "default": 12.5, 
      "description": "An explanation about the purpose of this instance.", 
      "id": "/properties/price", 
      "title": "The price schema", 
      "type": "number"
    }
  }, 
  "required": [
    "name", 
    "id", 
    "price"
  ], 
  "type": "object"
}
----

we can validate incoming JSON with the following Camel route, where `myschema.json` is loaded from the classpath.

[source,java]
----
from("direct:start")
  .to("json-validator:myschema.json")
  .to("mock:end")
----
