Skip to content

Commit 5ec08c7

Browse files
FWiesnerFlorian Wiesner
and
Florian Wiesner
authored
Implementation of #436 (#437)
Co-authored-by: Florian Wiesner <Florian [email protected]>
1 parent 9a8680c commit 5ec08c7

File tree

5 files changed

+81
-3
lines changed

5 files changed

+81
-3
lines changed

src/main/java/com/networknt/schema/AllOfValidator.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,10 @@ public Set<ValidationMessage> validate(JsonNode node, JsonNode rootNode, String
7070
registerAndMergeDiscriminator(currentDiscriminatorContext, discriminator, parentSchema, at);
7171
// now we have to check whether we have hit the right target
7272
final String discriminatorPropertyName = discriminator.get("propertyName").asText();
73-
final String discriminatorPropertyValue = node.get(discriminatorPropertyName).textValue();
73+
final JsonNode discriminatorNode = node.get(discriminatorPropertyName);
74+
final String discriminatorPropertyValue = discriminatorNode == null
75+
? null
76+
: discriminatorNode.textValue();
7477

7578
final JsonSchema jsonSchema = parentSchema;
7679
checkDiscriminatorMatch(

src/main/java/com/networknt/schema/AnyOfValidator.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ public Set<ValidationMessage> validate(JsonNode node, JsonNode rootNode, String
6565
if (schema.getValidators().containsKey(typeValidatorName)) {
6666
TypeValidator typeValidator = ((TypeValidator) schema.getValidators().get(typeValidatorName));
6767
//If schema has type validator and node type doesn't match with schemaType then ignore it
68-
//For union type, it is must to call TypeValidator
68+
//For union type, it is a must to call TypeValidator
6969
if (typeValidator.getSchemaType() != JsonType.UNION && !typeValidator.equalsToSchemaType(node)) {
7070
allErrors.add(buildValidationMessage(at, typeValidator.getSchemaType().toString()));
7171
continue;

src/main/java/com/networknt/schema/BaseJsonValidator.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -195,6 +195,11 @@ protected static void checkDiscriminatorMatch(final ValidationContext.Discrimina
195195
final ObjectNode discriminator,
196196
final String discriminatorPropertyValue,
197197
final JsonSchema jsonSchema) {
198+
if (discriminatorPropertyValue == null) {
199+
currentDiscriminatorContext.markMatch();
200+
return;
201+
}
202+
198203
final JsonNode discriminatorMapping = discriminator.get("mapping");
199204
if (null == discriminatorMapping) {
200205
checkForImplicitDiscriminatorMappingMatch(currentDiscriminatorContext,

src/main/java/com/networknt/schema/JsonSchema.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -264,7 +264,8 @@ public Set<ValidationMessage> validate(JsonNode jsonNode, JsonNode rootNode, Str
264264
}
265265

266266
final String discriminatorPropertyName = discriminatorToUse.get("propertyName").asText();
267-
final String discriminatorPropertyValue = jsonNode.get(discriminatorPropertyName).asText();
267+
final JsonNode discriminatorNode = jsonNode.get(discriminatorPropertyName);
268+
final String discriminatorPropertyValue = discriminatorNode == null ? null : discriminatorNode.asText();
268269
checkDiscriminatorMatch(discriminatorContext,
269270
discriminatorToUse,
270271
discriminatorPropertyValue,

src/test/resources/openapi3/discriminator.json

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -277,6 +277,75 @@
277277
"@type": "Bathroom"
278278
},
279279
"valid": false
280+
},
281+
{
282+
"description": "discriminator missing - falling back to default validation with failure as @type is mandatory",
283+
"data": {
284+
},
285+
"valid": false
286+
}
287+
]
288+
},
289+
{
290+
"description": "absent discriminator value as discriminator marked as non-mandatory (which is against OAS3 recommendations)",
291+
"schema": {
292+
"anyOf": [
293+
{
294+
"$ref": "#/components/schemas/Room"
295+
},
296+
{
297+
"$ref": "#/components/schemas/BedRoom"
298+
}
299+
],
300+
"components": {
301+
"schemas": {
302+
"Room": {
303+
"type": "object",
304+
"properties": {
305+
"intOrStringType": {
306+
"type": "integer"
307+
}
308+
},
309+
"discriminator": {
310+
"propertyName": "@type",
311+
"mapping": {
312+
"bed": "#/components/schemas/BedRoom"
313+
}
314+
}
315+
},
316+
"BedRoom": {
317+
"type": "object",
318+
"allOf": [
319+
{
320+
"$ref": "#/components/schemas/Room"
321+
},
322+
{
323+
"type": "object",
324+
"properties": {
325+
"intOrStringType": {
326+
"type": "string"
327+
}
328+
}
329+
}
330+
]
331+
}
332+
}
333+
}
334+
},
335+
"tests": [
336+
{
337+
"description": "discriminator missing - falling back to default anyOf behavior",
338+
"data": {
339+
"intOrStringType": 4
340+
},
341+
"valid": true
342+
},
343+
{
344+
"description": "discriminator missing - with constructed schema conflict",
345+
"data": {
346+
"intOrStringType": "cannot match due to allOf"
347+
},
348+
"valid": false
280349
}
281350
]
282351
},

0 commit comments

Comments
 (0)