繁体   English   中英

如何在多个 Json Schema 文件中使用 $id 和 $ref

[英]How to use $id and $ref in multiple Json Schema files

有很多例子说明如何在同一个 Json 模式文件中使用 $ id 和 $ ref。 但是我还没有找到任何关于如何将它与多个模式文件一起使用的示例。 我有一个 Spring 引导项目和 mongoDB。 我在路径中有我的架构文件:

/resources/schemas/
             root_schema.json
             centros_schema.json

root_schema.json 是一组建筑物(中心),而 centros_schema.json 是我定义建筑物(中心)的地方。

我已按照此处的文档进行操作。 但我无法使其工作并将centros_shema.json 中的$id 与root_schema 中的$ref 链接起来。 看看是否有人可以告诉我我该怎么做。

这是我的 root_schema.json:

{
    "$schema": "http://json-schema.org/draft-07/schema#",
    "type": "object",
    "properties": {
        "centros": {
            "type": "array",
            "items": [
                {
                    "$ref": "centros_schema.json"
                }
            ]
        }
    },
    "required": [
        "centros"
    ]
}

这是我的 centros_schema.json:

{
    "$schema": "http://json-schema.org/draft-07/schema#",
    "$id": "centros_schema.json",
    "type": "object",
    "properties": {
        "uid": {
            "type": "string"
        },
        "nombre": {
            "type": "string"
        },
        "tipo": {
            "type": "string"
        },
        "direccion": {
            "type": "object",
            "properties": {
                "calle": {
                    "type": "string"
                },
                "codigoPostal": {
                    "type": "string"
                },
                "municipio": {
                    "type": "string"
                },
                "provincia": {
                    "type": "string"
                },
                "ubicacion": {
                    "type": "object",
                    "properties": {
                        "latitud": {
                            "type": "string"
                        },
                        "longitud": {
                            "type": "string"
                        }
                    },
                    "required": [
                        "latitud",
                        "longitud"
                    ]
                }
            },
            "required": [
                "calle",
                "codigoPostal",
                "municipio",
                "provincia",
                "ubicacion"
            ]
        },
        "horario": {
            "type": "object",
            "properties": {
                "apertura": {
                    "type": "string"
                },
                "cierre": {
                    "type": "string"
                }
            },
            "required": [
                "apertura",
                "cierre"
            ]
        },
        "dispositivos": {
            "type": "array",
            "items": [
                {
                    "type": "object",
                    "properties": {
                        "uid": {
                            "type": "string"
                        },
                        "descripcion": {
                            "type": "string"
                        },
                        "tipo": {
                            "type": "string"
                        },
                        "adquisicion": {
                            "type": "string"
                        },
                        "sensores": {
                            "type": "array",
                            "items": [
                                {
                                    "type": "object",
                                    "properties": {
                                        "variable": {
                                            "type": "string"
                                        },
                                        "unidad": {
                                            "type": "string"
                                        }
                                    },
                                    "required": [
                                        "variable",
                                        "unidad"
                                    ]
                                },
                                {
                                    "type": "object",
                                    "properties": {
                                        "variable": {
                                            "type": "string"
                                        },
                                        "unidad": {
                                            "type": "string"
                                        }
                                    },
                                    "required": [
                                        "variable",
                                        "unidad"
                                    ]
                                }
                            ]
                        }
                    },
                    "required": [
                        "uid",
                        "descripcion",
                        "tipo",
                        "adquisicion",
                        "sensores"
                    ]
                },
                {
                    "type": "object",
                    "properties": {
                        "uid": {
                            "type": "string"
                        },
                        "descripcion": {
                            "type": "string"
                        },
                        "tipo": {
                            "type": "string"
                        },
                        "adquisicion": {
                            "type": "string"
                        },
                        "sensores": {
                            "type": "array",
                            "items": [
                                {
                                    "type": "object",
                                    "properties": {
                                        "variable": {
                                            "type": "string"
                                        },
                                        "unidad": {
                                            "type": "string"
                                        }
                                    },
                                    "required": [
                                        "variable",
                                        "unidad"
                                    ]
                                }
                            ]
                        }
                    },
                    "required": [
                        "uid",
                        "descripcion",
                        "tipo",
                        "adquisicion",
                        "sensores"
                    ]
                }
            ]
        }
    },
    "required": [
        "uid",
        "nombre",
        "tipo",
        "direccion",
        "horario",
        "dispositivos"
    ]
}

更新

这是它向我抛出的错误。 我使用哪些路线并不重要。

2021-05-24 21:34:54.140[0;39m [31mERROR[0;39m [35m4304[0;39m [2m---[0;39m [2m[nio-9000-exec-2][0;39m [36mo.a.c.c.C.[.[.[/].[dispatcherServlet]   [0;39m [2m:[0;39m Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is com.networknt.schema.JsonSchemaException: java.io.FileNotFoundException: \centros_schema.json (El sistema no puede encontrar el archivo especificado)] with root cause

java.io.FileNotFoundException: \centros_schema.json (El sistema no puede encontrar el archivo especificado)
    at java.io.FileInputStream.open0(Native Method) ~[na:1.8.0_291]
    at java.io.FileInputStream.open(Unknown Source) ~[na:1.8.0_291]
    at java.io.FileInputStream.<init>(Unknown Source) ~[na:1.8.0_291]
    at java.io.FileInputStream.<init>(Unknown Source) ~[na:1.8.0_291]
    at sun.net.www.protocol.file.FileURLConnection.connect(Unknown Source) ~[na:1.8.0_291]
    at sun.net.www.protocol.file.FileURLConnection.getInputStream(Unknown Source) ~[na:1.8.0_291]
    at com.networknt.schema.uri.URLFetcher.openConnectionCheckRedirects(URLFetcher.java:57) ~[json-schema-validator-1.0.52.jar:na]
    at com.networknt.schema.uri.URLFetcher.fetch(URLFetcher.java:43) ~[json-schema-validator-1.0.52.jar:na]
    at com.networknt.schema.uri.URISchemeFetcher.fetch(URISchemeFetcher.java:50) ~[json-schema-validator-1.0.52.jar:na]
    at com.networknt.schema.JsonSchemaFactory.getSchema(JsonSchemaFactory.java:337) ~[json-schema-validator-1.0.52.jar:na]
    at com.networknt.schema.RefValidator.getRefSchema(RefValidator.java:83) ~[json-schema-validator-1.0.52.jar:na]
    at com.networknt.schema.RefValidator.<init>(RefValidator.java:46) ~[json-schema-validator-1.0.52.jar:na]
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) ~[na:1.8.0_291]
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source) ~[na:1.8.0_291]
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source) ~[na:1.8.0_291]
    at java.lang.reflect.Constructor.newInstance(Unknown Source) ~[na:1.8.0_291]
    at com.networknt.schema.ValidatorTypeCode.newValidator(ValidatorTypeCode.java:131) ~[json-schema-validator-1.0.52.jar:na]
    at com.networknt.schema.JsonMetaSchema.newValidator(JsonMetaSchema.java:351) ~[json-schema-validator-1.0.52.jar:na]
    at com.networknt.schema.ValidationContext.newValidator(ValidationContext.java:57) ~[json-schema-validator-1.0.52.jar:na]
    at com.networknt.schema.JsonSchema.read(JsonSchema.java:217) ~[json-schema-validator-1.0.52.jar:na]
    at com.networknt.schema.JsonSchema.getValidators(JsonSchema.java:406) ~[json-schema-validator-1.0.52.jar:na]
    at com.networknt.schema.JsonSchema.validate(JsonSchema.java:239) ~[json-schema-validator-1.0.52.jar:na]
    at com.networknt.schema.ItemsValidator.doValidate(ItemsValidator.java:99) ~[json-schema-validator-1.0.52.jar:na]
    at com.networknt.schema.ItemsValidator.validate(ItemsValidator.java:80) ~[json-schema-validator-1.0.52.jar:na]
    at com.networknt.schema.JsonSchema.validate(JsonSchema.java:241) ~[json-schema-validator-1.0.52.jar:na]
    at com.networknt.schema.PropertiesValidator.validate(PropertiesValidator.java:70) ~[json-schema-validator-1.0.52.jar:na]
    at com.networknt.schema.JsonSchema.validate(JsonSchema.java:241) ~[json-schema-validator-1.0.52.jar:na]
    at com.networknt.schema.BaseJsonValidator.validate(BaseJsonValidator.java:103) ~[json-schema-validator-1.0.52.jar:na]
    at com.envira.gijonin.centros.utils.Utils.validateJsonUsingSchema(Utils.java:31) ~[classes/:na]
    at com.envira.gijonin.centros.centros.CentrosController.postCentros(CentrosController.java:83) ~[classes/:na]
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_291]
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) ~[na:1.8.0_291]
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) ~[na:1.8.0_291]
    at java.lang.reflect.Method.invoke(Unknown Source) ~[na:1.8.0_291]
    at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:197) ~[spring-web-5.3.6.jar:5.3.6]
    at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:141) ~[spring-web-5.3.6.jar:5.3.6]
    at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:106) ~[spring-webmvc-5.3.6.jar:5.3.6]
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:894) ~[spring-webmvc-5.3.6.jar:5.3.6]
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808) ~[spring-webmvc-5.3.6.jar:5.3.6]
    at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) ~[spring-webmvc-5.3.6.jar:5.3.6]
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1060) ~[spring-webmvc-5.3.6.jar:5.3.6]
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:962) ~[spring-webmvc-5.3.6.jar:5.3.6]
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) ~[spring-webmvc-5.3.6.jar:5.3.6]
    at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:909) ~[spring-webmvc-5.3.6.jar:5.3.6]
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:652) ~[tomcat-embed-core-9.0.45.jar:4.0.FR]
    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) ~[spring-webmvc-5.3.6.jar:5.3.6]
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:733) ~[tomcat-embed-core-9.0.45.jar:4.0.FR]
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:227) ~[tomcat-embed-core-9.0.45.jar:9.0.45]
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) ~[tomcat-embed-core-9.0.45.jar:9.0.45]
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) ~[tomcat-embed-websocket-9.0.45.jar:9.0.45]
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) ~[tomcat-embed-core-9.0.45.jar:9.0.45]
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) ~[tomcat-embed-core-9.0.45.jar:9.0.45]
    at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) ~[spring-web-5.3.6.jar:5.3.6]
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.6.jar:5.3.6]
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) ~[tomcat-embed-core-9.0.45.jar:9.0.45]
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) ~[tomcat-embed-core-9.0.45.jar:9.0.45]
    at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) ~[spring-web-5.3.6.jar:5.3.6]
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.6.jar:5.3.6]
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) ~[tomcat-embed-core-9.0.45.jar:9.0.45]
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) ~[tomcat-embed-core-9.0.45.jar:9.0.45]
    at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) ~[spring-web-5.3.6.jar:5.3.6]
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.6.jar:5.3.6]
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) ~[tomcat-embed-core-9.0.45.jar:9.0.45]
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) ~[tomcat-embed-core-9.0.45.jar:9.0.45]
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202) ~[tomcat-embed-core-9.0.45.jar:9.0.45]
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97) [tomcat-embed-core-9.0.45.jar:9.0.45]
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:542) [tomcat-embed-core-9.0.45.jar:9.0.45]
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:143) [tomcat-embed-core-9.0.45.jar:9.0.45]
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) [tomcat-embed-core-9.0.45.jar:9.0.45]
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78) [tomcat-embed-core-9.0.45.jar:9.0.45]
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:357) [tomcat-embed-core-9.0.45.jar:9.0.45]
    at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:374) [tomcat-embed-core-9.0.45.jar:9.0.45]
    at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) [tomcat-embed-core-9.0.45.jar:9.0.45]
    at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:893) [tomcat-embed-core-9.0.45.jar:9.0.45]
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1707) [tomcat-embed-core-9.0.45.jar:9.0.45]
    at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) [tomcat-embed-core-9.0.45.jar:9.0.45]
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) [na:1.8.0_291]
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) [na:1.8.0_291]
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) [tomcat-embed-core-9.0.45.jar:9.0.45]
    at java.lang.Thread.run(Unknown Source) [na:1.8.0_291]

更新 2

当我使用"$ref": "centros_schema.json"时,它似乎找到了该文件,但现在它向我抛出了以下错误:

[2m2021-05-24 21:45:14.175[0;39m [31mERROR[0;39m [35m4304[0;39m [2m---[0;39m [2m[nio-9000-exec-8][0;39m [36mo.a.c.c.C.[.[.[/].[dispatcherServlet]   [0;39m [2m:[0;39m Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is com.networknt.schema.JsonSchemaException: #/properties/centros/items/$ref: Reference centros_schema.json cannot be resolved] with root cause

com.networknt.schema.JsonSchemaException: #/properties/centros/items/$ref: Reference centros_schema.json cannot be resolved
    at com.networknt.schema.RefValidator.<init>(RefValidator.java:50) ~[json-schema-validator-1.0.52.jar:na]
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) ~[na:1.8.0_291]
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source) ~[na:1.8.0_291]
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source) ~[na:1.8.0_291]
    at java.lang.reflect.Constructor.newInstance(Unknown Source) ~[na:1.8.0_291]
    at com.networknt.schema.ValidatorTypeCode.newValidator(ValidatorTypeCode.java:131) ~[json-schema-validator-1.0.52.jar:na]
    at com.networknt.schema.JsonMetaSchema.newValidator(JsonMetaSchema.java:351) ~[json-schema-validator-1.0.52.jar:na]
    at com.networknt.schema.ValidationContext.newValidator(ValidationContext.java:57) ~[json-schema-validator-1.0.52.jar:na]
    at com.networknt.schema.JsonSchema.read(JsonSchema.java:217) ~[json-schema-validator-1.0.52.jar:na]
    at com.networknt.schema.JsonSchema.getValidators(JsonSchema.java:406) ~[json-schema-validator-1.0.52.jar:na]
    at com.networknt.schema.JsonSchema.validate(JsonSchema.java:239) ~[json-schema-validator-1.0.52.jar:na]
    at com.networknt.schema.ItemsValidator.doValidate(ItemsValidator.java:99) ~[json-schema-validator-1.0.52.jar:na]
    at com.networknt.schema.ItemsValidator.validate(ItemsValidator.java:80) ~[json-schema-validator-1.0.52.jar:na]
    at com.networknt.schema.JsonSchema.validate(JsonSchema.java:241) ~[json-schema-validator-1.0.52.jar:na]
    at com.networknt.schema.PropertiesValidator.validate(PropertiesValidator.java:70) ~[json-schema-validator-1.0.52.jar:na]
    at com.networknt.schema.JsonSchema.validate(JsonSchema.java:241) ~[json-schema-validator-1.0.52.jar:na]
    at com.networknt.schema.BaseJsonValidator.validate(BaseJsonValidator.java:103) ~[json-schema-validator-1.0.52.jar:na]
    at com.envira.gijonin.centros.utils.Utils.validateJsonUsingSchema(Utils.java:31) ~[classes/:na]
    at com.envira.gijonin.centros.centros.CentrosController.postCentros(CentrosController.java:83) ~[classes/:na]
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_291]
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) ~[na:1.8.0_291]
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) ~[na:1.8.0_291]
    at java.lang.reflect.Method.invoke(Unknown Source) ~[na:1.8.0_291]
    at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:197) ~[spring-web-5.3.6.jar:5.3.6]
    at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:141) ~[spring-web-5.3.6.jar:5.3.6]
    at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:106) ~[spring-webmvc-5.3.6.jar:5.3.6]
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:894) ~[spring-webmvc-5.3.6.jar:5.3.6]
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808) ~[spring-webmvc-5.3.6.jar:5.3.6]
    at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) ~[spring-webmvc-5.3.6.jar:5.3.6]
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1060) ~[spring-webmvc-5.3.6.jar:5.3.6]
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:962) ~[spring-webmvc-5.3.6.jar:5.3.6]
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) ~[spring-webmvc-5.3.6.jar:5.3.6]
    at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:909) ~[spring-webmvc-5.3.6.jar:5.3.6]
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:652) ~[tomcat-embed-core-9.0.45.jar:4.0.FR]
    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) ~[spring-webmvc-5.3.6.jar:5.3.6]
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:733) ~[tomcat-embed-core-9.0.45.jar:4.0.FR]
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:227) ~[tomcat-embed-core-9.0.45.jar:9.0.45]
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) ~[tomcat-embed-core-9.0.45.jar:9.0.45]
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) ~[tomcat-embed-websocket-9.0.45.jar:9.0.45]
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) ~[tomcat-embed-core-9.0.45.jar:9.0.45]
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) ~[tomcat-embed-core-9.0.45.jar:9.0.45]
    at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) ~[spring-web-5.3.6.jar:5.3.6]
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.6.jar:5.3.6]
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) ~[tomcat-embed-core-9.0.45.jar:9.0.45]
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) ~[tomcat-embed-core-9.0.45.jar:9.0.45]
    at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) ~[spring-web-5.3.6.jar:5.3.6]
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.6.jar:5.3.6]
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) ~[tomcat-embed-core-9.0.45.jar:9.0.45]
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) ~[tomcat-embed-core-9.0.45.jar:9.0.45]
    at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) ~[spring-web-5.3.6.jar:5.3.6]
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.6.jar:5.3.6]
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) ~[tomcat-embed-core-9.0.45.jar:9.0.45]
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) ~[tomcat-embed-core-9.0.45.jar:9.0.45]
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202) ~[tomcat-embed-core-9.0.45.jar:9.0.45]
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97) [tomcat-embed-core-9.0.45.jar:9.0.45]
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:542) [tomcat-embed-core-9.0.45.jar:9.0.45]
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:143) [tomcat-embed-core-9.0.45.jar:9.0.45]
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) [tomcat-embed-core-9.0.45.jar:9.0.45]
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78) [tomcat-embed-core-9.0.45.jar:9.0.45]
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:357) [tomcat-embed-core-9.0.45.jar:9.0.45]
    at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:374) [tomcat-embed-core-9.0.45.jar:9.0.45]
    at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) [tomcat-embed-core-9.0.45.jar:9.0.45]
    at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:893) [tomcat-embed-core-9.0.45.jar:9.0.45]
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1707) [tomcat-embed-core-9.0.45.jar:9.0.45]
    at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) [tomcat-embed-core-9.0.45.jar:9.0.45]
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) [na:1.8.0_291]
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) [na:1.8.0_291]
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) [tomcat-embed-core-9.0.45.jar:9.0.45]
    at java.lang.Thread.run(Unknown Source) [na:1.8.0_291]

JSON Schema $ref解析使用 URI 解析过程。 请注意,这些不是 URL,并且与任何物理文件的位置无关,也不是网络可寻址的。 $id只是一个标识符。

URI 不是网络定位器,只是一个标识符。 如果模式是网络可寻址的,则不需要从该地址下载模式
URL,实现不应该假设他们应该执行
遇到网络可寻址 URI 时的网络操作。

https://datatracker.ietf.org/doc/html/draft-handrews-json-schema-01#section-8.3

实际上,这意味着您必须将模式加载到实现中,因此它知道哪些标识符与哪些模式资源相关。

某些实现可能允许您从文件夹加载 JSON 文件,然后使用它们的$id值确定 URI 分辨率,但这些功能是特定于实现的。

您必须查看您正在使用的实现的文档,以了解如何加载其他模式。

此外, $ref中使用的 URI 是根据当前作用域架构资源的基本 URI 解析的。 您应该为您的主要模式定义一个$id以提供基本 URI。 把它想象成浏览器中的锚链接。 如果无法从架构资源建立基本 URI,则由实现确定,根据 URI 解析协议。

学习时最简单、最直接的引用方法是始终使用完整的 URI 进行引用。

如果你在一个模式中的 $ $id"$id": "http://ga4gh.org/schemas/discovery/search/definitions" ,那么你在另一个文件中的$ref可能看起来像"$ref": "http://ga4gh.org/schemas/discovery/search/definitions#definitions/semver"

您在问题中链接到的文档目前正在重写,我认为它将回答您关于该主题的所有问题。 现在,这里概述了识别和引用模式的工作原理。

架构由非相对 URI( https://example.com/path/to/schemafile:///path/to/schema )标识。 引用 ( $ref ) 可能是相对的,并针对文档的标识符进行解析以获取标识模式的非相对 URI。

如果您的架构的标识符是file:///path/to/schemas/root_schema.json并且架构引用了centros_schema.json 该参考解析为file:///path/to/schemas/centros_schema.json

但是,并非所有模式都有标识符。 如果您的架构没有标识符并且您的架构中有相对引用,则该引用无法解析为非相对 URI 以正确识别架构。 centros_schema.json无法解决 因为 不是非相对 URI。 这就是你得到的“参考无法解决”错误告诉你的。

一种解决方案是使您的$ref成为非相对 URI,因此它不需要标识符来完全解析。

{
    "$schema": "http://json-schema.org/draft-07/schema#",
    "type": "object",
    "properties": {
        "centros": {
            "type": "array",
            "items": [
                {
                    "$ref": "file:///path/to.schemas/centros_schema.json"
                }
            ]
        }
    },
    "required": [
        "centros"
    ]
}
{
    "$schema": "http://json-schema.org/draft-07/schema#",
    ... no $id needed for centros_schema.json
}

如果您使用的 JSON Schema 实现知道如何从文件系统获取file:// URI,这将起作用。 这似乎是这种情况,所以我将在这个假设下继续。

centros_schema.json模式不需要$id ,因为用于在root_schema.json中引用它的非相对 URI 成为模式的标识符。

解决问题的另一种方法是为root_schema.json分配一个标识符。

{
    "$schema": "http://json-schema.org/draft-07/schema#",
    "$id": "file:///path/to/schema/root_schema.json",
    "type": "object",
    "properties": {
        "centros": {
            "type": "array",
            "items": [
                {
                    "$ref": "centros_schema.json"
                }
            ]
        }
    },
    "required": [
        "centros"
    ]
}
{
    "$schema": "http://json-schema.org/draft-07/schema#",
    ... no $id needed for centros_schema.json
}

现在$ref可以是相对的,并且仍然解析为标识centros_schema.json模式的非相对 URI。

当然,这两种解决方案都要求您将文件系统路径硬编码到架构中,这可能会因多种原因造成问题。 理想情况下,JSON Schema 实现将首先使用用于获取root_schema.json的文件系统路径自动分配一个标识符。 然后您可以使用文件系统相对路径,而不必在任何地方分配$id

如果 JSON 架构实现不支持这一点,那么您可以使用$idhttps:// URI 分配给每个架构,并使用这些 URI 识别/引用它们。

{
    "$schema": "http://json-schema.org/draft-07/schema#",
    "$id": "https://example.com/path/to/schemas/root_schema.json",
    "type": "object",
    "properties": {
        "centros": {
            "type": "array",
            "items": [
                {
                    "$ref": "centros_schema.json"
                }
            ]
        }
    },
    "required": [
        "centros"
    ]
}
{
    "$schema": "http://json-schema.org/draft-07/schema#",
    "$id": "https://example.com/path/to/schemas/centros_schema.json",
}

使用此方法时,您需要在尝试使用您的模式验证实例之前,将两个模式预加载到 JSON 模式实现的内部模式数据库中。 这是如何完成的是特定于实现的,因此您必须检查您正在使用的 JSON 架构实现的文档。

我刚刚解决了。 有一件事我不明白。 我认为 Json Schema 的文档以及如何使用它是唯一需要记住的事情,因为它是一个“通用”跨平台系统。 但事实证明,并非所有图书馆都一样。 我正在使用这个依赖:

<dependency>
            <groupId>com.networknt</groupId>
            <artifactId>json-schema-validator</artifactId>
            <version>1.0.52</version>
        </dependency>

它需要在 uri 的开头添加单词“classpath”或“resource”。 所以对我有用的是删除 $id 并使用 $ref 如下:

"$ref": "classpath:/schemas/centros_schema.json"

非常感谢您的帮助。 它非常有用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM