我们会在每次构建应用程序时从 Java 模型自动生成 JSON 模式,并在特定 CI/CD 管道运行时自动发布该模式。我们需要对架构进行版本控制,并且架构版本与应用程序版本不同。
Schema 版本是在我们的应用程序代码中手动维护的;每当我们更改模型时,我们都需要手动增加常量中定义的模式版本。最终,每个模式版本都将作为 our-schema-x.y.json 发布到网站。
为了避免在不更新模式版本的情况下意外更改 Java 模型(以及模式),我们希望将之前发布的模式与新生成的模式进行比较,如果它们在语义上不同,则构建失败。
我们只关心结构模式更改,例如添加或删除允许的属性、允许的属性(枚举)值的更改……允许更新属性描述等非结构更改,在这种情况下,我们将更新已发布的属性架构版本。
问题是如何基于将模式反序列化为 Jackson JsonNode 实例来最好地执行此类比较:
由于您已经根据应用程序代码自动生成架构,我假设您可以控制架构中的详细信息级别。
一种可能的方法是生成单个模式版本的两种变体:完整的版本(带有描述、验证提示等)和简化的版本(仅关注结构)。 进行任何更改后,将生成新的简化模式。如果它与现有的简化模式相同,则模式版本可以保持原样。否则,需要增加模式版本,并且可以用新的模式替换简化的参考模式。
哪些属性可以安全忽略,哪些属性不能一般性地回答,并且还取决于您所针对的架构草稿版本。
oneOf
/anyOf
/allOf
/not
/if
/then
/else
这样的结构属性,type
、properties
、items
、definitions
/$defs
、$ref
属性,dependencies
、dependentSchemas
、$anchor
、$recursiveAnchor
、$recursiveRef
additionalProperties
,unevaluatedProperties
,patternProperties
,unevaluatedItems
,prefixItems
,contains
,propertyNames
等const
,enum
,required
,dependentRequired
,minimum
,maxLength
,minProperties
,maxItems
,..,.. .您已经说过uniqueItems
description
,title
之类的可以忽略。上面的一些验证属性可能也是如此。