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

Swagger/OpenApi-如何从equals/hascode方法中排除属性

宰父玄天
2023-03-14

通过Swagger/OpenApi生成代码时,我想从equals/hascode方法中排除一些属性。

以下是在YAML文件中定义的对象的示例:

ExampleDTO:
  type: object
  properties:
    id:
      type: integer
      format: int64
    property2:
      maxLength: 3
      minLength: 1
      pattern: '[0-9]*'
      type: string
    property3:
      maxLength: 5
      minLength: 1
      pattern: '[0-9]*'
      type: string

下面是生成的等于方法:

  @Override
  public boolean equals(java.lang.Object o) {
    if (this == o) {
      return true;
    }
    if (o == null || getClass() != o.getClass()) {
      return false;
    }
    ExampleDTO exampleDTO = (ExampleDTO) o;
    return Objects.equals(this.id, ExampleDTO.id) &&
        Objects.equals(this.property2, exampleDTO.property2) &&
        Objects.equals(this.property3, exampleDTO.property3);
  }

问题是,我只希望在等于方法中使用id属性。我该怎么做?谢谢


共有1个答案

韦智刚
2023-03-14

假设您使用的是“JavaSpring”生成器,您可以从https://github.com/swagger-api/swagger-codegen/tree/master/modules/swagger-codegen/src/main/resources/JavaSpring并修改,例如,https://github.com/swagger-api/swagger-codegen/blob/master/modules/swagger-codegen/src/main/resources/JavaSpring/pojo.mustache.

模板中的方法生成如下所示:

 @Override
  public boolean equals(java.lang.Object o) {
    if (this == o) {
      return true;
    }
    if (o == null || getClass() != o.getClass()) {
      return false;
    }{{#hasVars}}
    {{classname}} {{classVarName}} = ({{classname}}) o;
    return {{#vars}}Objects.equals(this.{{name}}, {{classVarName}}.{{name}}){{#hasMore}} &&
        {{/hasMore}}{{/vars}}{{#parent}} &&
        super.equals(o){{/parent}};{{/hasVars}}{{^hasVars}}
    return super.equals(o);{{/hasVars}}
  }

然后,在运行“swagger codegen maven插件”时,可以传递templateDirectory属性以指示模板的位置。

<templateDirectory>myTemplateDir</templateDirectory>

正如插件主页中所述:

修改客户端库格式

不喜欢默认的swagger客户端语法?想要支持不同的语言吗?没问题!Swagger Codesen使用justache引擎处理小胡子模板。您可以修改我们的模板或制作自己的模板。

您可以查看模块/swagger-coode en/src/main/Resources/${your-Language}以获取示例。要制作自己的模板,请创建自己的文件并使用-t标志指定模板文件夹。它实际上就是这么简单。

这种方法的问题是会影响所有“Pojo”对象。

如果您想要更细粒度的生成,那么您需要自定义自己的生成器,例如扩展现有的生成器(如JavaSpring)并在

<language>com.my.package.for.GeneratorLanguage</language>

就像这里通知的一样。

在这种情况下,您需要更改模板,以便它们可以处理创建类的特定处理。

 类似资料:
  • 我已经试过了,但是Swagger UI不能渲染它,所以我猜测它是错误的:

  • 问题内容: 我已经创建了下面的对象,该对象将被映射到ElasticSearch类型。我想从索引中排除该属性: 问题答案: 您应该能够设置属性的值,如下所示:

  • 我想从类型中排除一个单独的属性。我该怎么做呢? 比如我有 我想排除属性 以获得

  • 我正在尝试使用https://github.com/pseudomuto/protoc-gen-doc,我无法找到在消息中排除grpc服务/字段的一些API的方法。 在swagger中找到了相关的样式,但似乎找不到将其添加到Pro buf文件中的方法http://watson-developer-cloud.github.io/api-guidelines/swagger-coding-style

  • 我找不到如何在AspectJ1.9.1中排除所有final方法。我在这里找到了早期版本的答案,但我无法使其工作。

  • 我们如何排除模型中“groovy”类的元类属性作为响应?我有一个Jax-Rs资源,它返回一个带swagger@ApiModel注释的groovy对象。我在swagger ui中看到了太多时髦的特定属性。如何从序列化中排除它? 它似乎在使用Jackson进行pogo json序列化?如何注释我的groovy类,将元类属性排除在json序列化字符串中?我试着使用JsonIgnoreProperties