当前位置: 首页 > 知识库问答 >
问题:

即使additionalProperties设置为false,Json架构仍允许附加财产

严稳
2023-03-14

给定以下架构:

export const MESSAGE_SCHEMA = {
  additionalProperties: false,
  type: 'object',
  properties: {
    comment: { type: 'string' },
    startAt: { type: 'string' },
    states: {
      type: 'object',
      minProperties: 1,
      patternProperties: {
        "^[A-Za-z]+[A-Za-z0-9 ]{0,127}$": {
          type: 'object',
          properties: {
            type: { type: 'string', enum: TASK_TYPES_ALL_ENUM },
            next: { type: 'string' },
            end: { type: 'boolean' },
            choices: {
              type: 'array',
              items: {
                type: 'object'
              },
              minItems: 2
            },
            default: { type: 'string' },
            error: { type: 'string' },
            cause: { type: 'string' },
            resource: { type: 'string' },
          },
          required: ['type'],
          allOf: [
            // Make choices required if task type = 'choice'
            {
              if: {
                properties: { type: { const: TASK_TYPE_CHOICE } }
              },
              then: {
                required: ['type', 'choices']
              }
            }
          ]
        }
      },
      additionalProperties: false
    }
  },
  required: ['startAt','states']
};

如果我将有效负载发送到我的API中,其中包含与模式不匹配的“状态”对象中的键,它总是允许请求…我理解的行为应该通过属性/PatelnProperties addtionalProperties=false来防止这种情况,但事实并非如此…

例如-这应该是错误的,因为模式不匹配并且不允许使用其他属性,但我从API收到响应,就好像它已成功验证:

{
    "eventNamespace": "state",
    "eventType": "transition",
    "payload": {
        "foo": "bar"
    },
    "message": {
        "startAt": "foo",
        "states": {
            "!#@^@^": {
                "type": "choice",
                "choices": []
            }
        }
    }
}

如果我随后输入一个与模式匹配的值,则会出现验证失败(如预期的那样):

{
    "eventNamespace": "state",
    "eventType": "transition",
    "payload": {
        "foo": "bar"
    },
    "message": {
        "startAt": "foo",
        "states": {
            "valid property example": {
                "type": "choice",
                "choices": []
            }
        }
    }
}

响应:

{
    "statusCode": 400,
    "error": "Bad Request",
    "message": "body/message/states/valid property example/choices must NOT have fewer than 2 items"
}

共有2个答案

和和裕
2023-03-14

最有可能的是,这是因为Fastify验证器默认删除其他属性。您可以通过设置删除附加:假来禁用此行为:

const server = Fastify({
  ajv: {
    customOptions: {
      removeAdditional: false
    }
  }
})

有关更多信息,请访问https://www . fastify . io/docs/latest/Reference/Validation-and-Serialization/

高明辉
2023-03-14

你的模式很好。当我通过我的验证器运行它时,我得到:

{
  "errors" : [
    {
      "error" : "additional property not permitted",
      "instanceLocation" : "/states/!#@^@^",
      "keywordLocation" : "/properties/states/additionalProperties"
    },
    {
      "error" : "not all additional properties are valid",
      "instanceLocation" : "/states",
      "keywordLocation" : "/properties/states/additionalProperties"
    },
    {
      "error" : "not all properties are valid",
      "instanceLocation" : "",
      "keywordLocation" : "/properties"
    }
  ],
  "valid" : false
}

我建议您为您正在使用的实现打开错误报告。

 类似资料:
  • 我有一个包含用户及其密码的数据库。当我启动应用程序时,我会创建一些具有角色的用户,并将其存储到数据库中。我的用户实体: 和用户角色实体 默认情况下,列角色是唯一的=false,但当我添加userA与角色:管理员,用户,然后userB与角色:用户,记录userB-用户覆盖记录userA-用户。有人能指出我的错误是什么吗? 我正在使用hibernate 5 spring 5

  • 问题内容: 我将每个列都设置为,但是由于某种原因,我仍然能够在每个列中添加一个值。这是我的表信息(创建语法): 这是一个有效的示例: 有什么想法为什么会这样? 问题答案: 您要插入空字符串,而空字符串不是,要检查错误,请执行以下操作: 你会看到错误。该只对那些不值检查。 为了防止空字符串,您必须使用触发器,或者在执行查询之前对服务器端编程语言进行检查以将空字符串转换为。的示例触发器可能类似于:(这

  • 试图测试从清单引用的Android的网络安全config config XML文件中的不同配置。使用针对Android 9 API 28和Galaxy Nexus Android 9模拟器vis VS 2019的基本新应用程序模板Xamarin.Android应用程序,设置为: > 应用程序级清单设置Android:UsesClearTextTraffic=false 添加一个网络安全配置文件,将

  • 本文向大家介绍SpringBoot框架RESTful接口设置跨域允许,包括了SpringBoot框架RESTful接口设置跨域允许的使用技巧和注意事项,需要的朋友参考一下 跨域 跨域请求是指浏览器脚本文件在发送请求时,脚本所在的服务器和请求的服务器地址不一样。跨域是有浏览器的同源策略造成的,是浏览器对JavaScript施加的安全限制, 同源策略:是指协议、域名、端口都要相同,其中有一个不同都会产

  • 我使用的是与node.js快递4.12.3和mysql db招摇过市2.0。 我创建了以下模式- 此处删除的_at字段将为空,并且在删除记录之前不会出现在数据库中。我的基于express的nodejs服务器返回的日期如下- [{id:4,“国家”:“g”,“创建时间”:“2018-01-29T04:51:46.000Z”,“删除时间”:null},{id:5,“国家”:“gaaaf”,“创建时间”

  • 我对SQL比较熟悉,对如何最好地表示以下内容的实体关系图有点困惑: 假设我们有一个公司。公司有员工。员工有经理(多名员工对1名经理)。管理者是雇员(但管理者不能管理自己)。每个员工/经理可以在多个项目上(一个EMP/经理对多个项目)。此外,员工/经理在公司中有许多角色(1个EMP/经理到许多角色)。 我最困惑的是如何将经理嵌入员工内部。我是否需要包含任何约束,以确保没有经理管理自己? 下面是我到目

  • 我已经构建了一个API(API.example.com),希望它可以从www.example.com访问。com 我还希望它可以从其他域访问 为此,我添加了访问-控制-允许-起源:* 但是当我打开www.example.com时,在所有api请求之前发送了一个预飞行请求(OPTIONS请求) 如何停止多个预飞行请求?我想应该只有一个起飞前的要求,我做错了什么!!!?或者浏览器在每次通话前都要发送飞

  • 问题内容: 我们都知道Java在(被认为是“常用” )范围内为数字缓存(以及一些其他类型)。 缓存的设计如下: 我知道可以通过为JVM提供参数来扩展值: 我不明白的是为什么我们不允许覆盖该值? 请注意,我并不是想找到一种解决方法,而是要理解为什么出于某些晦涩的原因而不允许这样做。 问题答案: 发现对此已经存在未解决的RFP。 乔·达西(Joe Darcy)对这个问题发表了评论: 可以想象也可以缓存