json-schema-validator icon indicating copy to clipboard operation
json-schema-validator copied to clipboard

$ref with def doesn't work under anyOf

Open palwe-prafulla opened this issue 3 years ago • 2 comments

I have a definitions written in json schema like below:

// defs for an array of items which can contain either ipv4 address or domain name or mix
"listOfIpv4OrDomainNameAddressesDef": {
      "type": "array",
      "uniqueItems": true,
      "minItems": 1,
      "maxItems": 10,
      "additionalProperties": false,
      "items": {
        "anyOf": [
          {
              "$ref" : "#/defs/domainNameDef"
          },
          {
               "$ref": "#/defs/ipv4AddressDef"
          }
        ]
      }
    },

// domainNameDef
"domainNameDef" : {
 "type": "string",
  "pattern": "(^((([a-zA-Z0-9_]([a-zA-Z0-9\\-_]){0,61})?[a-zA-Z0-9]\\.)*([a-zA-Z0-9_]([a-zA-Z0-9\\-_]){0,61})?[a-zA-Z0-9]\\.?$)|(^\\.$))",
  "minLength": 1,
  "maxLength": 253
}

// ipv4 address def
"ipv4AddressDef" : {
 "type": "string",
 "format": "ipv4"
}

But when i run the code to validate json against this schema i get exception as below: com.networknt.schema.JsonSchemaException: anyOf/$ref: Reference #/$defs/domainNameDef cannot be resolved at com.networknt.schema.RefValidator.(RefValidator.java:45) ~[json-schema-validator-1.0.57.jar:?] at jdk.internal.reflect.GeneratedConstructorAccessor10.newInstance(Unknown Source) ~[?:?] at jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) ~[?:?] at java.lang.reflect.Constructor.newInstance(Constructor.java:490) ~[?:?] at com.networknt.schema.ValidatorTypeCode.newValidator(ValidatorTypeCode.java:131) ~[json-schema-validator-1.0.57.jar:?] at com.networknt.schema.JsonMetaSchema.newValidator(JsonMetaSchema.java:388) ~[json-schema-validator-1.0.57.jar:?] at com.networknt.schema.ValidationContext.newValidator(ValidationContext.java:57) ~[json-schema-validator-1.0.57.jar:?] at com.networknt.schema.JsonSchema.read(JsonSchema.java:223) ~[json-schema-validator-1.0.57.jar:?] at com.networknt.schema.JsonSchema.getValidators(JsonSchema.java:412) ~[json-schema-validator-1.0.57.jar:?] at com.networknt.schema.AnyOfValidator.validate(AnyOfValidator.java:65) ~[json-schema-validator-1.0.57.jar:?] at com.networknt.schema.JsonSchema.validate(JsonSchema.java:247) ~[json-schema-validator-1.0.57.jar:?] at com.networknt.schema.ItemsValidator.doValidate(ItemsValidator.java:99) ~[json-schema-validator-1.0.57.jar:?] at com.networknt.schema.ItemsValidator.validate(ItemsValidator.java:86) ~[json-schema-validator-1.0.57.jar:?] at com.networknt.schema.JsonSchema.validate(JsonSchema.java:247) ~[json-schema-validator-1.0.57.jar:?] at com.networknt.schema.JsonSchemaRef.validate(JsonSchemaRef.java:38) ~[json-schema-validator-1.0.57.jar:?] at com.networknt.schema.RefValidator.validate(RefValidator.java:133) ~[json-schema-validator-1.0.57.jar:?] at com.networknt.schema.JsonSchema.validate(JsonSchema.java:247) ~[json-schema-validator-1.0.57.jar:?] at com.networknt.schema.PropertiesValidator.validate(PropertiesValidator.java:68) ~[json-schema-validator-1.0.57.jar:?] at com.networknt.schema.JsonSchema.validate(JsonSchema.java:247) ~[json-schema-validator-1.0.57.jar:?] at com.networknt.schema.JsonSchemaRef.validate(JsonSchemaRef.java:38) ~[json-schema-validator-1.0.57.jar:?] at com.networknt.schema.RefValidator.validate(RefValidator.java:133) ~[json-schema-validator-1.0.57.jar:?] at com.networknt.schema.JsonSchema.validate(JsonSchema.java:247) ~[json-schema-validator-1.0.57.jar:?] at com.networknt.schema.OneOfValidator.validate(OneOfValidator.java:160) ~[json-schema-validator-1.0.57.jar:?] at com.networknt.schema.JsonSchema.validate(JsonSchema.java:247) ~[json-schema-validator-1.0.57.jar:?] at com.networknt.schema.JsonSchemaRef.validate(JsonSchemaRef.java:38) ~[json-schema-validator-1.0.57.jar:?] at com.networknt.schema.RefValidator.validate(RefValidator.java:133) ~[json-schema-validator-1.0.57.jar:?] at com.networknt.schema.JsonSchema.validate(JsonSchema.java:247) ~[json-schema-validator-1.0.57.jar:?] at com.networknt.schema.PropertiesValidator.validate(PropertiesValidator.java:68) ~[json-schema-validator-1.0.57.jar:?] at com.networknt.schema.JsonSchema.validate(JsonSchema.java:247) ~[json-schema-validator-1.0.57.jar:?] at com.networknt.schema.PropertiesValidator.validate(PropertiesValidator.java:68) ~[json-schema-validator-1.0.57.jar:?] at com.networknt.schema.JsonSchema.validate(JsonSchema.java:247) ~[json-schema-validator-1.0.57.jar:?] at com.networknt.schema.ItemsValidator.doValidate(ItemsValidator.java:99) ~[json-schema-validator-1.0.57.jar:?] at com.networknt.schema.ItemsValidator.validate(ItemsValidator.java:86) ~[json-schema-validator-1.0.57.jar:?] at com.networknt.schema.JsonSchema.validate(JsonSchema.java:247) ~[json-schema-validator-1.0.57.jar:?] at com.networknt.schema.PropertiesValidator.validate(PropertiesValidator.java:68) ~[json-schema-validator-1.0.57.jar:?] at com.networknt.schema.JsonSchema.validate(JsonSchema.java:247) ~[json-schema-validator-1.0.57.jar:?] at com.networknt.schema.PropertiesValidator.validate(PropertiesValidator.java:68) ~[json-schema-validator-1.0.57.jar:?] at com.networknt.schema.JsonSchema.validate(JsonSchema.java:247) ~[json-schema-validator-1.0.57.jar:?] at com.networknt.schema.BaseJsonValidator.validate(BaseJsonValidator.java:104) ~[json-schema-validator-1.0.57.jar:?]

Everything works fine if i just move the definitions as is under the any of like below:

// defs for an array of items which can contain either ipv4 address or domain name or mix
"listOfIpv4OrDomainNameAddressesDef": {
      "type": "array",
      "uniqueItems": true,
      "minItems": 1,
      "maxItems": 10,
      "additionalProperties": false,
      "items": {
        "anyOf": [
          {
              "type": "string",
              "pattern": "(^((([a-zA-Z0-9_]([a-zA-Z0-9\\-_]){0,61})?[a-zA-Z0-9]\\.)*([a-zA-Z0-9_]([a-zA-Z0-9\\-_]){0,61})?[a-zA-Z0-9]\\.?$)|(^\\.$))",
              "minLength": 1,
              "maxLength": 253
          },
          {
                "type": "string",
                 "format": "ipv4"
          }
        ]
      }
    }

I am puzzled as to why $ref under anyOf doesn't work.. everything works if i just change anyOf to oneOf..

Is there any open issue for this?

Any help would be really appreciated..

I am using 2019-09 draft asbbelow: "$schema": "http://json-schema.org/draft/2019-09/schema",

palwe-prafulla avatar Aug 26 '22 22:08 palwe-prafulla

We are not aware of this issue, and it might be introduced recently with some changes. I am wondering if you could submit a b PR with your test case so that we can debug it. Thanks.

stevehu avatar Aug 27 '22 10:08 stevehu

I found a similar issue. Will open a PR tomorrow.

ranma2913 avatar Sep 23 '22 04:09 ranma2913

This should be addressed with the latest version.

stevehu avatar May 30 '24 20:05 stevehu