繁体   English   中英

JSON POJO 架构 - 枚举作为单独的 java 文件

[英]JSON Schema to POJO - Enum as a separate java file

Type.json(枚举)

{
    "type" : "string",
    "$schema" : "http://json-schema.org/draft-04/schema#",
    "title": "type resource",
    "name": "type resource",
    "description": "List of types",
    "id" : "type:v1",
    "enum" : 
        [
        "ACC1",
        "ACC2"
        ]
}

Pojo1.json

"properties":{
            "type" : {
                "$ref" : "Type.json"
            },
}

Pojo2.json

"properties":{
            "type" : {
                "$ref" : "Type.json"
            },
}

它不是为枚举创建一个单独的 java 文件,而是在其中一个 POJO 中创建一个枚举,并且这个内部公共枚举由另一个 POJO 引用。

Pojo2.java

private com.Pojo1.Type type;

如何为枚举创建一个单独的 java 文件? 谢谢

它看起来不像在 jsonschema2pojo 中作为选项支持将枚举创建为单独的类。

枚举的生成由org.jsonschema2pojo.rules.EnumRule 执行

其中的 javadoc 指出:

创建了一个 Java {@link Enum},其中包含模式中存在的每个枚举值的常量。 枚举名称派生自 nodeName,枚举类型本身被创建为拥有类型的内部类。 在不存在拥有类型(枚举是模式的根)的极少数情况下,枚举本身就成为一个公共类。

听起来您需要提出功能请求

在撰写本文时,jsonschema2pojo 库中已经提供了一个功能。 在我的调查过程中,我看到了这篇文章,但对无法引用生成的类或枚举的答案并不满意。 所以我在文档中深入挖掘了一点,它确实为我提供了一些额外的扩展属性,用于通常的 json 模式规范(javaTypes、javaInterfaces、javaEnumNames、javaJsonView、javaName)。 扩展属性 javaType 的文档说明:

jsonschema2pojo 支持适用于模式的扩展属性“javaType”,并允许您为生成的 Java 类型指定完全限定名称。

鉴于这些知识,您的示例需要像这样重写:

Type.json(枚举)

{
    "$schema" : "http://json-schema.org/draft-04/schema#",
    "type" : "string",
    "title": "type resource",
    "name": "type resource",
    "description": "List of types",
    "id" : "type:v1",
    "type_enum": {
      "javaType" : "com.mycompany.TypeEnum",
      "$ref": "TypeEnum.json#/definitions/type_enum"
    }
}

我们现在用引用$ref替换您的枚举定义,其中包括javaType的专用包路径和类名。 类型类中相应枚举的引用 json 模式将如下所示:

TypeEnum.json(枚举)

 {
  "$schema": "http://json-schema.org/draft-04/schema#",
  "definitions": {
    "type_enum": {
      "enum": [
        "ACC1",
        "ACC2"
      ],
      "description": "All values for the enum in the type class."
    }
  }
}

Pojo 定义 Pojo1 和 Pojo2 保持不变。 您甚至可以在其他类中引用枚举,如下所示:

TypeV1_1.json(枚举)

{
    "$schema" : "http://json-schema.org/draft-04/schema#",
    "type" : "string",
    "title": "type version 1.1 resource",
    "name": "type version 1.1 resource",
    "description": "List of version 1.1 types",
    "id" : "type:v1_1",
    "type_enum": {
      "javaType" : "com.mycompany.TypeEnum",
      "$ref": "TypeEnum.json#/definitions/type_enum"
    }
}

让您始终只为您定义的 javaType 生成一个枚举。

这可能是我这样做的:

 "atributes": {
  "description": "Additional message attributes",
  "type": "object",
  "properties": {
    "action": {
      "description": "Action to do over document",
      "$ref" : "Action.json#"
    }
  },
  "additionalProperties": false,
  "examples": "{\"action\":\"UPSERT\"}"
}

和动作枚举:

{

      "title": "Action",
      "description": "Action description",
      "type": "string",
      "enum": [
        "BATCH",
        "DELETE",
        "UNSUPPORTED"
      ],
      "javaEnumNames": [
        "UPSERT",
        "DELETE",
        "UNSUPPORTED"
      ]
    }

暂无
暂无

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

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