json - 将 XSD 导入 OpenAPI

标签 json xsd openapi

我在 XSD 文件中有一些模型定义,我需要从 OpenApi 定义中引用这些模型。由于文件太大,无法手动重构,我需要将其放入构建系统,以便如果更改 XSD,我可以为 OpenApi 重新生成模型/模式。

我尝试过的和几乎有效的方法是使用 xsd2json然后使用节点模块 json-schema-to-openapi 进行转换.然而xsd2json正在丢弃一些 complexElement楷模。例如 "$ref": "#/definitions/tns:ContentNode"在一个模型中用作子类型,但没有 ContentNode 的定义在模式中,当我查看 XSD 时,有一个 complexElement ContentNode 的定义.

另一种我还没有尝试过但对我来说似乎有点过分的方法是使用 xjb 从 XSD 生成 Java 模型,然后使用 JacksonSchema 生成 json 模式。

是否有任何既定的库或方法可以在 OpenApi 中使用 XSD?

最佳答案

我最终实现了第二种方法,使用 jaxb 将 XSD 转换为 java 模型,然后使用 Jackson 将模式写入文件。

Gradle :

plugins {
    id 'java'
    id 'application'
}

group 'foo'
version '1.0-SNAPSHOT'

sourceCompatibility = 1.8

repositories {
    mavenCentral()
}

dependencies {
    testCompile group: 'junit', name: 'junit', version: '4.12'
    compile group: 'com.fasterxml.jackson.module', name: 'jackson-module-jsonSchema', version: '2.9.8'
}

configurations {
    jaxb
}

dependencies {
    jaxb (
            'com.sun.xml.bind:jaxb-xjc:2.2.7',
            'com.sun.xml.bind:jaxb-impl:2.2.7'
    )
}

application {
    mainClassName = 'foo.bar.Main'
}

task runConverter(type: JavaExec, group: 'application') {
    classpath = sourceSets.main.runtimeClasspath

    main = 'foo.bar.Main'
}

task jaxb {
    System.setProperty('javax.xml.accessExternalSchema', 'all')
    def jaxbTargetDir = file("src/main/java")

    doLast {
        jaxbTargetDir.mkdirs()

        ant.taskdef(
                name: 'xjc',
                classname: 'com.sun.tools.xjc.XJCTask',
                classpath: configurations.jaxb.asPath
        )
        ant.jaxbTargetDir = jaxbTargetDir

        ant.xjc(
                destdir: '${jaxbTargetDir}',
                package: 'foo.bar.model',
                schema: 'src/main/resources/crs.xsd'
        )
    }
}

compileJava.dependsOn jaxb

使用转换器主类,它可以执行以下操作:
package foo.bar;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.module.jsonSchema.JsonSchema;
import com.fasterxml.jackson.module.jsonSchema.JsonSchemaGenerator;
import foo.bar.model.Documents;

public class Main {

    public static void main(String[] args) {
        ObjectMapper mapper = new ObjectMapper();
        JsonSchemaGenerator schemaGen = new JsonSchemaGenerator(mapper);
        try {
            JsonSchema schema = schemaGen.generateSchema(Documents.class);
            System.out.print(mapper.writerWithDefaultPrettyPrinter().writeValueAsString(schema));
        } catch (JsonMappingException e) {
            e.printStackTrace();
        } catch (JsonProcessingException e) {
            e.printStackTrace();
        }
    }

}

尽管如此,它仍然不完美,......这需要迭代所有模型类并生成一个带有模式的文件。此外,它不使用引用,如果一个类具有另一个类的成员,则模式将内联打印而不是引用。这需要对 SchemaFactoryWrapper 进行更多的自定义。但可以做到。

关于json - 将 XSD 导入 OpenAPI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56018335/

相关文章:

swagger-ui - 在 OpenAPI 3.0 中引用 self

javascript - 将 CSV 文件放入堆栈布局 d3.js 中的内置数组中

java - 自定义序列化器和 jackson 模式

c# - 在验证方法中使用 .xsd 文件

spring-boot - 设置swagger API版本的动态版本

rest - 验证 OpenAPI 对 REST 设计最佳实践的合规性

javascript - HTTP + JSON 简单 api 请求作为空白发送

sql - Postgresql根据其JSONB字段值总和更新记录列

java - XML 架构验证 : Cannot find the declaration of element (root)

binding - JAXB:匿名简单类型作为枚举?