This is an automated email from the ASF dual-hosted git repository.
jamesnetherton pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/camel-quarkus.git
The following commit(s) were added to refs/heads/main by this push:
new a9ad59abae Verify expected json-validator error messages
a9ad59abae is described below
commit a9ad59abae244f347e552cdaceb2682a617f436d
Author: James Netherton <[email protected]>
AuthorDate: Thu Mar 6 09:13:31 2025 +0000
Verify expected json-validator error messages
---
extensions/json-validator/deployment/pom.xml | 4 ++
.../deployment/JsonValidatorProcessor.java | 13 +++--
extensions/json-validator/runtime/pom.xml | 4 ++
integration-tests/json-validator/pom.xml | 4 ++
.../json/validator/it/JsonValidatorResource.java | 68 +++++++++++++++++-----
.../json/validator/it/JsonValidatorRoute.java | 10 ++--
.../json-validator/src/main/resources/schema.json | 3 +-
.../json/validator/it/JsonValidatorTest.java | 51 ++++++++++++----
8 files changed, 122 insertions(+), 35 deletions(-)
diff --git a/extensions/json-validator/deployment/pom.xml
b/extensions/json-validator/deployment/pom.xml
index 2c85fcc9c9..19f0c45304 100644
--- a/extensions/json-validator/deployment/pom.xml
+++ b/extensions/json-validator/deployment/pom.xml
@@ -30,6 +30,10 @@
<name>Camel Quarkus :: JSON Schema Validator :: Deployment</name>
<dependencies>
+ <dependency>
+ <groupId>io.quarkus</groupId>
+ <artifactId>quarkus-jackson-deployment</artifactId>
+ </dependency>
<dependency>
<groupId>org.apache.camel.quarkus</groupId>
<artifactId>camel-quarkus-core-deployment</artifactId>
diff --git
a/extensions/json-validator/deployment/src/main/java/org/apache/camel/quarkus/component/json/validator/deployment/JsonValidatorProcessor.java
b/extensions/json-validator/deployment/src/main/java/org/apache/camel/quarkus/component/json/validator/deployment/JsonValidatorProcessor.java
index 6e218d05d4..eb376766a5 100644
---
a/extensions/json-validator/deployment/src/main/java/org/apache/camel/quarkus/component/json/validator/deployment/JsonValidatorProcessor.java
+++
b/extensions/json-validator/deployment/src/main/java/org/apache/camel/quarkus/component/json/validator/deployment/JsonValidatorProcessor.java
@@ -22,6 +22,7 @@ import io.quarkus.deployment.builditem.CombinedIndexBuildItem;
import io.quarkus.deployment.builditem.FeatureBuildItem;
import io.quarkus.deployment.builditem.IndexDependencyBuildItem;
import io.quarkus.deployment.builditem.nativeimage.ReflectiveClassBuildItem;
+import org.jboss.jandex.ClassInfo;
import org.jboss.jandex.DotName;
class JsonValidatorProcessor {
@@ -44,10 +45,14 @@ class JsonValidatorProcessor {
* So, let's register all the known JsonValidator implementations for
reflective access in native mode.
*/
@BuildStep
- void registerReflectiveClasses(CombinedIndexBuildItem combinedIndex,
+ void registerReflectiveClasses(
+ CombinedIndexBuildItem combinedIndex,
BuildProducer<ReflectiveClassBuildItem> reflectiveProducer) {
-
combinedIndex.getIndex().getAllKnownImplementors(VALIDATOR_INTERFACE).stream()
- .forEach(c -> reflectiveProducer
-
.produce(ReflectiveClassBuildItem.builder(c.name().toString()).build()));
+ combinedIndex.getIndex()
+ .getAllKnownImplementors(VALIDATOR_INTERFACE)
+ .stream()
+ .map(ClassInfo::name)
+ .map(DotName::toString)
+ .forEach(c ->
reflectiveProducer.produce(ReflectiveClassBuildItem.builder(c).build()));
}
}
diff --git a/extensions/json-validator/runtime/pom.xml
b/extensions/json-validator/runtime/pom.xml
index 94d6369fa0..b8d374e309 100644
--- a/extensions/json-validator/runtime/pom.xml
+++ b/extensions/json-validator/runtime/pom.xml
@@ -36,6 +36,10 @@
</properties>
<dependencies>
+ <dependency>
+ <groupId>io.quarkus</groupId>
+ <artifactId>quarkus-jackson</artifactId>
+ </dependency>
<dependency>
<groupId>org.apache.camel.quarkus</groupId>
<artifactId>camel-quarkus-core</artifactId>
diff --git a/integration-tests/json-validator/pom.xml
b/integration-tests/json-validator/pom.xml
index a7144d347c..7938d27cef 100644
--- a/integration-tests/json-validator/pom.xml
+++ b/integration-tests/json-validator/pom.xml
@@ -43,6 +43,10 @@
<groupId>io.quarkus</groupId>
<artifactId>quarkus-resteasy</artifactId>
</dependency>
+ <dependency>
+ <groupId>io.quarkus</groupId>
+ <artifactId>quarkus-resteasy-jackson</artifactId>
+ </dependency>
<!-- test dependencies -->
<dependency>
diff --git
a/integration-tests/json-validator/src/main/java/org/apache/camel/quarkus/component/json/validator/it/JsonValidatorResource.java
b/integration-tests/json-validator/src/main/java/org/apache/camel/quarkus/component/json/validator/it/JsonValidatorResource.java
index 6338ef4d83..aa66bcf47b 100644
---
a/integration-tests/json-validator/src/main/java/org/apache/camel/quarkus/component/json/validator/it/JsonValidatorResource.java
+++
b/integration-tests/json-validator/src/main/java/org/apache/camel/quarkus/component/json/validator/it/JsonValidatorResource.java
@@ -18,7 +18,9 @@ package org.apache.camel.quarkus.component.json.validator.it;
import java.io.ByteArrayInputStream;
import java.nio.charset.StandardCharsets;
+import java.util.List;
+import com.networknt.schema.ValidationMessage;
import jakarta.enterprise.context.ApplicationScoped;
import jakarta.inject.Inject;
import jakarta.ws.rs.Consumes;
@@ -26,7 +28,9 @@ import jakarta.ws.rs.GET;
import jakarta.ws.rs.Path;
import jakarta.ws.rs.Produces;
import jakarta.ws.rs.core.MediaType;
+import org.apache.camel.CamelExecutionException;
import org.apache.camel.ProducerTemplate;
+import org.apache.camel.component.jsonvalidator.JsonValidationException;
import org.jboss.logging.Logger;
@Path("/json-validator")
@@ -41,29 +45,65 @@ public class JsonValidatorResource {
@Path("/validate")
@GET
@Consumes(MediaType.TEXT_PLAIN)
- @Produces(MediaType.TEXT_PLAIN)
- public String validate(String json) {
- LOG.infof("Calling validate with: %s", json);
- return producerTemplate.requestBody("direct:validate-json", json,
String.class);
+ @Produces(MediaType.APPLICATION_JSON)
+ public List<String> validate(String json) {
+ try {
+ LOG.infof("Calling validate with: %s", json);
+ String result =
producerTemplate.requestBody("direct:validate-json", json, String.class);
+ return List.of(result);
+ } catch (CamelExecutionException e) {
+ if (e.getCause() instanceof JsonValidationException jve) {
+ return jve.getErrors()
+ .stream()
+ .map(ValidationMessage::getError)
+ .toList();
+ } else {
+ throw e;
+ }
+ }
}
@Path("/validate-as-stream")
@GET
@Consumes(MediaType.TEXT_PLAIN)
- @Produces(MediaType.TEXT_PLAIN)
- public String validateAsStream(String json) {
- LOG.infof("Calling validateAsStream with: %s", json);
- ByteArrayInputStream bais = new
ByteArrayInputStream(json.getBytes(StandardCharsets.UTF_8));
- return producerTemplate.requestBody("direct:validate-json", bais,
String.class) + "-as-stream";
+ @Produces(MediaType.APPLICATION_JSON)
+ public List<String> validateAsStream(String json) {
+ try {
+ LOG.infof("Calling validateAsStream with: %s", json);
+ ByteArrayInputStream bais = new
ByteArrayInputStream(json.getBytes(StandardCharsets.UTF_8));
+ String result =
producerTemplate.requestBody("direct:validate-json", bais, String.class) +
"-as-stream";
+ return List.of(result);
+ } catch (CamelExecutionException e) {
+ if (e.getCause() instanceof JsonValidationException jve) {
+ return jve.getErrors()
+ .stream()
+ .map(ValidationMessage::getError)
+ .toList();
+ } else {
+ throw e;
+ }
+ }
}
@Path("/validate-from-header")
@GET
@Consumes(MediaType.TEXT_PLAIN)
- @Produces(MediaType.TEXT_PLAIN)
- public String validateFromHeader(String json) {
- LOG.infof("Calling validateFromHeader with: %s", json);
- return
producerTemplate.requestBodyAndHeader("direct:validate-json-from-header", null,
"headerToValidate",
- json, String.class);
+ @Produces(MediaType.APPLICATION_JSON)
+ public List<String> validateFromHeader(String json) {
+ try {
+ LOG.infof("Calling validateFromHeader with: %s", json);
+ String result =
producerTemplate.requestBodyAndHeader("direct:validate-json-from-header", null,
"headerToValidate",
+ json, String.class);
+ return List.of(result);
+ } catch (CamelExecutionException e) {
+ if (e.getCause() instanceof JsonValidationException jve) {
+ return jve.getErrors()
+ .stream()
+ .map(ValidationMessage::getError)
+ .toList();
+ } else {
+ throw e;
+ }
+ }
}
}
diff --git
a/integration-tests/json-validator/src/main/java/org/apache/camel/quarkus/component/json/validator/it/JsonValidatorRoute.java
b/integration-tests/json-validator/src/main/java/org/apache/camel/quarkus/component/json/validator/it/JsonValidatorRoute.java
index dd8844897f..1824c4fc69 100644
---
a/integration-tests/json-validator/src/main/java/org/apache/camel/quarkus/component/json/validator/it/JsonValidatorRoute.java
+++
b/integration-tests/json-validator/src/main/java/org/apache/camel/quarkus/component/json/validator/it/JsonValidatorRoute.java
@@ -17,7 +17,6 @@
package org.apache.camel.quarkus.component.json.validator.it;
import jakarta.enterprise.context.ApplicationScoped;
-import org.apache.camel.ValidationException;
import org.apache.camel.builder.RouteBuilder;
@ApplicationScoped
@@ -25,11 +24,10 @@ public class JsonValidatorRoute extends RouteBuilder {
@Override
public void configure() {
-
from("direct:validate-json").doTry().to("json-validator:schema.json").setBody(constant("valid"))
-
.doCatch(ValidationException.class).setBody(constant("invalid")).end();
+ from("direct:validate-json")
+ .to("json-validator:schema.json").setBody(constant("valid"));
-
from("direct:validate-json-from-header").doTry().to("json-validator:schema.json?headerName=headerToValidate")
- .setBody(constant("valid-header"))
-
.doCatch(ValidationException.class).setBody(constant("invalid-header")).end();
+ from("direct:validate-json-from-header")
+
.to("json-validator:schema.json?headerName=headerToValidate").setBody(constant("valid-header"));
}
}
diff --git a/integration-tests/json-validator/src/main/resources/schema.json
b/integration-tests/json-validator/src/main/resources/schema.json
index f5d493f4a8..8f5da2252a 100644
--- a/integration-tests/json-validator/src/main/resources/schema.json
+++ b/integration-tests/json-validator/src/main/resources/schema.json
@@ -25,6 +25,7 @@
"name",
"id",
"price"
- ],
+ ],
+ "additionalProperties": false,
"type": "object"
}
\ No newline at end of file
diff --git
a/integration-tests/json-validator/src/test/java/org/apache/camel/quarkus/component/json/validator/it/JsonValidatorTest.java
b/integration-tests/json-validator/src/test/java/org/apache/camel/quarkus/component/json/validator/it/JsonValidatorTest.java
index 9512549799..58e371602a 100644
---
a/integration-tests/json-validator/src/test/java/org/apache/camel/quarkus/component/json/validator/it/JsonValidatorTest.java
+++
b/integration-tests/json-validator/src/test/java/org/apache/camel/quarkus/component/json/validator/it/JsonValidatorTest.java
@@ -20,46 +20,77 @@ import io.quarkus.test.junit.QuarkusTest;
import org.junit.jupiter.api.Test;
import static io.restassured.RestAssured.given;
+import static org.hamcrest.Matchers.containsString;
import static org.hamcrest.Matchers.is;
@QuarkusTest
class JsonValidatorTest {
-
@Test
public void validJsonShouldBeValidated() {
final String validJson = "{ \"name\": \"John Doe\", \"id\": 1,
\"price\": 12.5 }";
-
given().body(validJson).get("/json-validator/validate").then().statusCode(200).body(is("valid"));
+ given()
+ .body(validJson)
+ .get("/json-validator/validate")
+ .then()
+ .statusCode(200)
+ .body("[0]", is("valid"));
}
@Test
public void invalidJsonShouldNotBeValidated() {
- final String invalidJson = "{ \"name\": \"John Doe\", \"id\": \"AA1\",
\"price\": 12.5 }";
-
given().body(invalidJson).get("/json-validator/validate").then().statusCode(200).body(is("invalid"));
+ final String invalidJson = "{ \"name\": \"John Doe\", \"id\": \"AA1\",
\"unknown\": \"not in schema\" }";
+ given()
+ .body(invalidJson)
+ .get("/json-validator/validate")
+ .then()
+ .statusCode(200)
+ .body(
+ "[0]", is("string found, integer expected"),
+ "[1]", is("required property 'price' not found"),
+ "[2]", containsString("property 'unknown' is not
defined in the schema"));
}
@Test
public void validJsonFromHeaderShouldBeValidated() {
final String validJson = "{ \"name\": \"John Doe\", \"id\": 1,
\"price\": 12.5 }";
-
given().body(validJson).get("/json-validator/validate-from-header").then().statusCode(200).body(is("valid-header"));
+ given()
+ .body(validJson)
+ .get("/json-validator/validate-from-header")
+ .then()
+ .statusCode(200)
+ .body("[0]", is("valid-header"));
}
@Test
public void invalidJsonFromHeaderShouldNotBeValidated() {
final String invalidJson = "{ \"name\": \"John Doe\", \"id\": \"AA1\",
\"price\": 12.5 }";
-
given().body(invalidJson).get("/json-validator/validate-from-header").then().statusCode(200).body(is("invalid-header"));
+ given()
+ .body(invalidJson)
+ .get("/json-validator/validate-from-header")
+ .then()
+ .statusCode(200)
+ .body("[0]", is("string found, integer expected"));
}
@Test
public void validJsonAsStreamShouldBeValidated() {
final String validJson = "{ \"name\": \"John Doe\", \"id\": 1,
\"price\": 12.5 }";
-
given().body(validJson).get("/json-validator/validate-as-stream").then().statusCode(200).body(is("valid-as-stream"));
+ given()
+ .body(validJson)
+ .get("/json-validator/validate-as-stream")
+ .then()
+ .statusCode(200)
+ .body("[0]", is("valid-as-stream"));
}
@Test
public void invalidJsonAsStreamShouldNotBeValidated() {
final String invalidJson = "{ \"name\": \"John Doe\", \"id\": \"AA1\",
\"price\": 12.5 }";
-
given().body(invalidJson).get("/json-validator/validate-as-stream").then().statusCode(200)
- .body(is("invalid-as-stream"));
+ given()
+ .body(invalidJson)
+ .get("/json-validator/validate-as-stream")
+ .then()
+ .statusCode(200)
+ .body("[0]", is("string found, integer expected"));
}
-
}