首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在多个Json Schema文件中使用$id和$ref

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

Stack Overflow用户
提问于 2021-05-24 21:00:55
回答 3查看 303关注 0票数 0

有许多关于如何在同一个Json模式文件中使用$ id和$ ref的示例。但是我还没有找到任何示例来说明如何在多个模式文件中使用它。我在一个Spring Boot项目和mongoDB中工作。我的架构文件位于以下路径:

代码语言:javascript
复制
/resources/schemas/
             root_schema.json
             centros_schema.json

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

我遵循了文档here。但我一直无法使其工作,并将centros_shema.json中的$id与root_schema中的$ref链接起来。看看有没有人能告诉我怎么做。

这是我的root_schema.json:

代码语言:javascript
复制
{
    "$schema": "http://json-schema.org/draft-07/schema#",
    "type": "object",
    "properties": {
        "centros": {
            "type": "array",
            "items": [
                {
                    "$ref": "centros_schema.json"
                }
            ]
        }
    },
    "required": [
        "centros"
    ]
}

这是我的centros_schema.json:

代码语言:javascript
复制
{
    "$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"
    ]
}

已更新

这就是它抛给我的错误。我使用哪种路由并不重要。

代码语言:javascript
复制
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"时,它似乎可以找到文件,但现在它抛出以下错误:

代码语言:javascript
复制
[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]
EN

回答 3

Stack Overflow用户

发布于 2021-05-24 23:03:11

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

URI不是网络定位符,只是一个标识符。如果模式是网络可寻址的,则不必从地址下载该模式

URL,并且实现不应假定它们应该执行

当他们遇到网络可寻址URI时进行网络操作。

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

在实践中,这意味着您必须将模式加载到实现中,以便它知道哪些标识符与哪些模式资源相关。

一些实现可能允许您从文件夹加载JSON文件,然后使用它们的JSON值来确定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"

票数 0
EN

Stack Overflow用户

发布于 2021-05-26 03:17:27

您在问题中链接的文档目前正在重写中,我认为它将回答您在此主题上的所有问题。现在,我们将概述标识和引用模式的工作原理。

模式由非相对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,这样它就不需要标识符即可完全解析。

代码语言:javascript
复制
{
    "$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"
    ]
}
代码语言:javascript
复制
{
    "$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分配一个标识符。

代码语言:javascript
复制
{
    "$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"
    ]
}
代码语言:javascript
复制
{
    "$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 Schema实现不支持这一点,那么可以使用$idhttps:// URI分配给每个模式,并使用这些URI标识/引用它们。

代码语言:javascript
复制
{
    "$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"
    ]
}
代码语言:javascript
复制
{
    "$schema": "http://json-schema.org/draft-07/schema#",
    "$id": "https://example.com/path/to/schemas/centros_schema.json",
}

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

票数 0
EN

Stack Overflow用户

发布于 2021-05-26 18:36:05

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

代码语言:javascript
复制
<dependency>
            <groupId>com.networknt</groupId>
            <artifactId>json-schema-validator</artifactId>
            <version>1.0.52</version>
        </dependency>

并且需要在uri的开头添加单词"classpath“或"resource”。因此,对我来说起作用的是删除$id并使用$ref,如下所示:

代码语言:javascript
复制
"$ref": "classpath:/schemas/centros_schema.json"

非常感谢你的帮助。这是非常有用的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67672500

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档