gradle OpenAPI Java生成器Casesensitve定义名称和保留字

p1iqtdky  于 2023-04-06  发布在  Java
关注(0)|答案(1)|浏览(129)

我有问题的OpenAPI java生成器时,有一个定义,其中包含一个模式,如(不幸的是,我得到这个定义从第三方)

"ExtendedBasicdata": {
      "type": "object",
      "properties": {
        "ExtendedBasicData": {
          "type": "array",
          "items": {
            "$ref": "#/definitions/Extendedbasicdata"
          }
        }
      }
    },
    "Extendedbasicdata": {
      "type": "object",
      "properties": {
        "ID": {
          "type": "string"
        },
        "Country": {
          "type": "string"
        }
      }
    },
   "objects": {
      "type": "object",
      "properties": {
        "id": {
          "type": "string"
        },
        "label": {
          "type": "string"
        },
        "entityId": {
          "type": "string"
        }
      }
    },

第一个问题是ExtendedBasicdata和Extendedbasicdata这两个对象只有大小写的区别。生成器只创建了一个名为Extendedbasicdata但类名为ExtendedBasicdata的java文件,这会导致错误Class 'Extendedbasicdata' is public, should be declared in a file named 'Extendedbasicdata.java'。是否有可能使生成器区分大小写?
第二个问题是generator正在导入java.util.Objects;在默认情况下,因此类Object不能存在。有没有一种方法可以在生成过程中覆盖这个名字?

n3schb8v

n3schb8v1#

Don't Do This

更改属性大小写

您的ExtendedBasicdata类包含一个名为ExtendedBasicDataExtendedbasicdata的arrayList。

public class ExtendedBasicdata {

  private List<Extendedbasicdata> ExtendedBasicData;

}

正如本节的标题所说,“不要这样做”。这是一个可怕的设计,正如另一位评论者所说,它也很容易出错。我还假设你为了问题的目的而使用这些名称,它们实际上不是使用的名称,只是相同的基本概念。
第二,属性名应该用camelCase命名。这只是一个标准的命名约定。然而,生成器也知道这一点,并将字段名转换为camelCase。
最后,为了真正回答你的问题,你肯定可以通过mustache templates影响名字的生成方式。具体来说,你可以识别你想要的类和方法,并对它们应用lambda来改变它们的大小写。

覆盖对象

至于Objects的问题,您还可以修改所有模板以使用Object的完全限定路径名并删除导入。
例如,在model.mustache中,可以删除import java.util.Objects;行,在pojo.mustache中,修改line311以使用完全限定名。

return a == b || (a != null && b != null && a.isPresent() && b.isPresent() && java.util.Objects.deepEquals(a.get(), b.get()));

你将不得不删除每个mustache模板中的每个import语句,并在整个代码中完整地拼写出Object的每个实现的路径。这是一项大量的工作,可以通过重命名属性来轻松解决。

更好的选择

我想重申一遍,我不建议你这么做,我知道你使用的是第三方API,但如果这是真的,这只是他们api的一个小例子,我只能想象还有什么其他问题存在。
一种选择是使用您自己的API定义,并在需要时引用其他定义。

RenamedFromExtendedBasicData:
  type: object
  properties:
    anotherNewName:
      type: array
      items:
        $ref: './bad3rdpartyspecification.yaml#/definitions/Extendedbasicdata`

这使您可以使用良好的命名约定,同时仍然依赖于重要对象的其他规范。

相关问题