更改Spring openapi生成器maven插件生成接口的返回类型



我已经成功地从.yaml开放api描述符文件生成了接口,但正如问题标题中所述,我很想将这些接口的响应类型从ResponseEntity更改为我自己的类型。基本上不是具有此签名的接口:

ResponseEntity<Void> clearCache();

对于一种基本上是这样实现的方法:

public void clearCache(){ //do something}

我希望生成的界面像一样简单

void clearCache();

我自己定义的类也是如此,我希望它只使用MyBook作为返回类型,而不是ResponseEntity<MyBook> getBook(String ISBN);,所以它应该看起来像MyBook getBook(String ISBN);我为openapi生成器插件使用的当前设置是

<plugin>
<groupId>org.openapitools</groupId>
<artifactId>openapi-generator-maven-plugin</artifactId>
<version>4.3.0</version>
<executions>
<execution>
<phase>generate-sources</phase>
<goals>
<goal>generate</goal>
</goals>
<configuration>
<inputSpec>my-own-service-be/src/main/resources/api-docs.yaml</inputSpec>
<generatorName>spring</generatorName>
<additionalProperties>
<additionalProperty>skipDefaultInterface=true</additionalProperty>
<additionalProperty>interfaceOnly=true</additionalProperty>
</additionalProperties>
<generateApis>true</generateApis>
<apiPackage>controller</apiPackage>
<supportingFilesToGenerate>false</supportingFilesToGenerate>
<modelPackage>dto</modelPackage>
<generateModelTests>false</generateModelTests>
<generateApiTests>false</generateApiTests>
</configuration>
</execution>
</executions>
</plugin>

我们最近遇到了类似的挑战。你需要做的是调整模板。为此,您需要从生成器的OpenAPI项目中找到源模板。在您的情况下,这就是api.mustache文件。

只需将其复制到例如您的src/main/resources/文件夹(可能位于名为custom的子文件夹中(,并根据您的需要进行调整,即替换响应类型。

然后,您需要调整pom.xml,以便实际使用您的自定义模板文件:

<configuration>
<!-- The following line is crucial: -->
<templateDirectory>${project.basedir}/src/main/resources/custom</templateDirectory>
<inputSpec>${project.basedir}/src/main/resources/api.yaml</inputSpec>
<generatorName>spring</generatorName>
<configOptions>
<sourceFolder>src/gen/java/main</sourceFolder>
</configOptions>
</configuration>

还可以查看此模板文档以获取有关该主题的更多信息。

我不知道你为什么要这么做。您可以将ResponseEntity简单地想象为您的类型的包装器,增加了处理标准HTTP功能(如HTTP状态代码和标头(的可能性。请参阅此处了解更多详细信息。在你的情况下,你只会做

ResponseEntity.noContent().build(); //void
ResponseEntity.ok(myBook) //to return your MyBook type

philonous的回答是朝着好的方向迈出的一步。Spring Boot的所有模板都可以在这里找到。但改变只是";api.胡子;是不够的,因为";api.胡子;不包含默认方法实现的模板。您必须禁用默认方法实现的生成,或者更改它的模板。

如前所述,您必须在pom.xml中指定模板目录:

<configuration>
<templateDirectory>${project.basedir}/src/main/resources/custom</templateDirectory>
<skipDefaultInterface>true</skipDefaultInterface>

步骤1-api.胡子

此处删除";导入org.springframework.http.ResponseEntity&";,只是为了确保它不再被使用。然后从返回类型中删除ResponseEntity;响应实体<{{>returnTypes}}"用";{{>returnTypes}}";。问题是这仍然生成默认实现;return new ResponseEntity<gt;(HttpStatus.NOT_IMPLEMENTED("在生成的Api类中,因此我们必须更改其他模板。

步骤2-禁用默认方法生成或更改方法Body.splash

禁用用";skipDefaultInterface";选项(如pom.xml中所示(。否则编辑";methodBody.胡子";添加";抛出新的IllegalArgumentException("未实现"(//"在";return new ResponseEntity<gt"或者做其他事情来指示该方法尚未实现。

最新更新