diff --git a/src/main/java/com/networknt/schema/OneOfValidator.java b/src/main/java/com/networknt/schema/OneOfValidator.java index 1df336927..dd0353a3d 100644 --- a/src/main/java/com/networknt/schema/OneOfValidator.java +++ b/src/main/java/com/networknt/schema/OneOfValidator.java @@ -188,6 +188,7 @@ public Set validate(JsonNode node, JsonNode rootNode, String childErrors.addAll(schemaErrors); } + Set childNotRequiredErrors = childErrors.stream().filter(error -> !ValidatorTypeCode.REQUIRED.getValue().equals(error.getType())).collect(Collectors.toSet()); // ensure there is always an "OneOf" error reported if number of valid schemas is not equal to 1. if (numberOfValidSchema > 1) { @@ -200,6 +201,9 @@ public Set validate(JsonNode node, JsonNode rootNode, String // ensure there is always an "OneOf" error reported if number of valid schemas is not equal to 1. else if (numberOfValidSchema < 1) { + if (!childNotRequiredErrors.isEmpty()) { + childErrors = childNotRequiredErrors; + } if (!childErrors.isEmpty()) { if (childErrors.size() > 1) { Set notAdditionalPropertiesOnly = new LinkedHashSet<>(childErrors.stream() diff --git a/src/test/java/com/networknt/schema/Issue491Test.java b/src/test/java/com/networknt/schema/Issue491Test.java index 84fea6317..777655001 100644 --- a/src/test/java/com/networknt/schema/Issue491Test.java +++ b/src/test/java/com/networknt/schema/Issue491Test.java @@ -93,7 +93,7 @@ void testInvalidJson1() throws Exception { JsonSchema schema = factory.getSchema(schemaInputStream); JsonNode node = getJsonNodeFromJsonData("/data/issue491-invalid-1.json"); Set errors = schema.validate(node); - Assertions.assertEquals(2, errors.size()); + Assertions.assertEquals(1, errors.size()); Assertions.assertEquals("$.search.searchAge.age: string found, integer expected", errors.iterator().next().getMessage()); } @@ -104,7 +104,7 @@ void testInvalidJson2() throws Exception { JsonSchema schema = factory.getSchema(schemaInputStream); JsonNode node = getJsonNodeFromJsonData("/data/issue491-invalid-2.json"); Set errors = schema.validate(node); - Assertions.assertEquals(2, errors.size()); + Assertions.assertEquals(1, errors.size()); Assertions.assertEquals("$.search.name: integer found, string expected", errors.iterator().next().getMessage()); } @@ -115,7 +115,7 @@ void testInvalidJson3() throws Exception { JsonSchema schema = factory.getSchema(schemaInputStream); JsonNode node = getJsonNodeFromJsonData("/data/issue491-invalid-3.json"); Set errors = schema.validate(node); - Assertions.assertEquals(2, errors.size()); + Assertions.assertEquals(1, errors.size()); Assertions.assertEquals("$.search.byAge.age: string found, integer expected", errors.iterator().next().getMessage()); } @@ -126,7 +126,7 @@ void testInvalidJson4() throws Exception { JsonSchema schema = factory.getSchema(schemaInputStream); JsonNode node = getJsonNodeFromJsonData("/data/issue491-invalid-2.json"); Set errors = schema.validate(node); - Assertions.assertEquals(2, errors.size()); + Assertions.assertEquals(1, errors.size()); Assertions.assertEquals("$.search.name: integer found, string expected", errors.iterator().next().getMessage()); } @@ -138,7 +138,7 @@ void testInvalidJson5(String jsonPath, String expectedError) throws Exception { JsonSchema schema = factory.getSchema(schemaInputStream); JsonNode node = getJsonNodeFromJsonData(jsonPath); Set errors = schema.validate(node); - Assertions.assertEquals(2, errors.size()); + Assertions.assertEquals(1, errors.size()); Assertions.assertEquals(expectedError, errors.iterator().next().getMessage()); }