Openapi生成器maven插件可为空属性问题

问题描述 投票:0回答:2

我尝试在使用 openapi 3 规范设计的 API 中引入可为 null 的属性。这个想法是始终将属性返回给客户端,无论它们的值是否为空。

YAML 文件(我先尝试无默认,结果相同):

       property:
          type: integer
          nullable: true
          default: null

生成的Java代码:

  @JsonProperty("property")
  private JsonNullable<Integer> property = JsonNullable.undefined();

API 响应:

  "property": {
    "present": true
  }

因此,无论属性是否为 null,结果始终为“present: true”。如果没有可空性,它的效果就很好,除了从响应中删除空值,这是不希望的。

有什么想法吗?

附注该房产实际上并未被命名为“房产”

编辑:配置:

<generateAliasAsModel>true</generateAliasAsModel>
<inputSpec>./api/interface1.yaml</inputSpec>
<generatorName>spring</generatorName>
<enablePostProcessFile>true</enablePostProcessFile>
<configOptions>
    <sourceFolder>src/main/java</sourceFolder>
    <library>spring-boot</library>
    <java8>true</java8>
    <interfaceOnly>true</interfaceOnly>
    <useOptional>true</useOptional>
</configOptions>
java json nullable openapi openapi-generator
2个回答
0
投票

属性可以称为

nullable
,用于在 openApi 中传递 null 值。 OpenApi 生成器使用 JsonNullable 包装数据类型,如下所示。

private JsonNullable<String> firstField = JsonNullable.undefined();

您在问题中提到的回复表示该属性存在但不是真实值,当对象未正确序列化时会发生这种情况。只需注册

JsonNullableModule
就应该指示如何序列化解析器,例如 jackson。

@Bean
public Module jsonNullableModule() {
   return new JsonNullableModule();
}

至少在版本中

org.openapitools:jackson-databind-nullable:0.2.1
我没有看到这样的问题,意味着不需要明确注册上述内容,因为它是由库本身处理的。


0
投票

感谢 @maniganda-prakash 的帮助,我能够通过在

ObjectMapper
使用的自定义
RestTemplate
中注册模块来解决我的问题。

类似这样的:

var objectMapper = new ObjectMapper().registerModule(new JsonNullableModule());
var httpMessageConverter = new MappingJackson2HttpMessageConverter(objectMapper);
var restTemplate = RestTemplateBuilder.restTemplate().build();
restTemplate.getMessageConverters().add(0, httpMessageConverter);   
© www.soinside.com 2019 - 2024. All rights reserved.