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

用于生成不一致类的Java的OpenAPI Maven插件

罗鸿畴
2023-03-14

我们使用openapi生成器maven-plugin版本5.0.1来生成我们的API。我试图指定一个请求,包括一个DTO和一个文件。

第一个奇怪的事情是生成的代码不使用DTO,它基本上是扁平化字段,这样API就期望指定每个字段。然而,我们并不太关心这个问题,因为我们可以指定每个字段(尽管如果它像预期的那样工作会很好)。

杀死我们的问题是为应用编程接口和应用编程接口委托生成的类彼此不一致。生成的API将每个字段视为String。但是,API委托将它们视为可选

以下是我们的POM,以及相关的依赖项和插件配置:

        <dependency>
            <groupId>io.swagger</groupId>
            <artifactId>swagger-annotations</artifactId>
            <version>1.6.2</version>
        </dependency>
        <dependency>
            <groupId>org.openapitools</groupId>
            <artifactId>jackson-databind-nullable</artifactId>
            <version>0.2.1</version>
        </dependency>
        <dependency>
            <groupId>javax.validation</groupId>
            <artifactId>validation-api</artifactId>
            <version>2.0.1.Final</version>
        </dependency>
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger2</artifactId>
            <version>2.9.2</version>
        </dependency>
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger-ui</artifactId>
            <version>2.9.2</version>
        </dependency>
...
<plugin>
    <groupId>org.openapitools</groupId>
    <artifactId>openapi-generator-maven-plugin</artifactId>
    <version>5.0.1</version>
    <executions>
        <execution>
            <id>processor-Generate</id>
            <goals>
                <goal>generate</goal>
            </goals>
            <configuration>
                <inputSpec>
                    ${project.basedir}/apis/innovation-ivp-inventory-accuracy-acl-api.yml
                </inputSpec>
                <generatorName>spring</generatorName>
                <apiPackage>${project.groupId}.inventory.accuracy.acl.api</apiPackage>
                <modelPackage>${project.groupId}.inventory.accuracy.acl.dto</modelPackage>
                <invokerPackage>${project.groupId}.inventory.accuracy.acl.api.handler</invokerPackage>
                <supportingFilesToGenerate>ApiUtil.java,OpenAPIDocumentationConfig.java
                </supportingFilesToGenerate>
                <configOptions>
                    <useTags>true</useTags>
                    <dateLibrary>java8-localdatetime</dateLibrary>
                    <java8>true</java8>
                    <delegatePattern>true</delegatePattern>
                    <useBeanValidation>true</useBeanValidation>
                    <useOptional>true</useOptional>
                    <configPackage>${project.groupId}.inventory.accuracy.acl.api</configPackage>
                </configOptions>
                <output>${project.build.directory}/generated-sources</output>
            </configuration>
        </execution>
    </executions>
</plugin>

以下是我们的OpenAPI规范:

'/email':
  post:
    tags:
      - email-service
    summary: Email Service
    operationId: sendEmail
    requestBody:
      required: true
      content:
        multipart/mixed:
          schema:
            allOf:
              - $ref: '#/components/schemas/EmailRequestDTO'
              - type: object
                properties:
                  file:
                    type: string
                    format: binary
    responses:
      "200":
        description: OK
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/EmailResponseDTO'
components:
  schemas:
    EmailRequestDTO:
      type: object
      properties:
        sendTo:
          type: string
        sentFrom:
          type: string
        subject:
          type: string
        content:
          type: string
    EmailResponseDTO:
      type: object
      properties:
        status:
          type: string
        errorMessage:
          type: string

以下是OpenAPI生成的API类(请注意,参数都是字符串):

public interface EmailServiceApi {

    @ApiOperation(value = "Email Service", nickname = "sendEmail", notes = "", response = EmailResponseDTO.class, tags={ "email-service", })
    @ApiResponses(value = {
        @ApiResponse(code = 200, message = "OK", response = EmailResponseDTO.class) })
    @PostMapping(
        value = "/email",
        produces = { "application/json" },
        consumes = { "multipart/mixed" }
    )
    default ResponseEntity<EmailResponseDTO> sendEmail(@ApiParam(value = "") @Valid @RequestPart(value = "sendTo", required = false)  String sendTo,@ApiParam(value = "") @Valid @RequestPart(value = "sentFrom", required = false)  String sentFrom,@ApiParam(value = "") @Valid @RequestPart(value = "subject", required = false)  String subject,@ApiParam(value = "") @Valid @RequestPart(value = "content", required = false)  String content,@ApiParam(value = "") @Valid @RequestPart(value = "file", required = false) MultipartFile file) {
        return getDelegate().sendEmail(sendTo, sentFrom, subject, content, file);
    }
}

这里是OpenAPI生成的API委托类(注意参数都是可选的):

public interface EmailServiceApiDelegate {
    default ResponseEntity<EmailResponseDTO> sendEmail(Optional<String> sendTo,
        Optional<String> sentFrom,
        Optional<String> subject,
        Optional<String> content,
        MultipartFile file) {
        getRequest().ifPresent(request -> {
            for (MediaType mediaType: MediaType.parseMediaTypes(request.getHeader("Accept"))) {
                if (mediaType.isCompatibleWith(MediaType.valueOf("application/json"))) {
                    String exampleString = "{ \"errorMessage\" : \"errorMessage\", \"status\" : \"status\" }";
                    ApiUtil.setExampleResponse(request, "application/json", exampleString);
                    break;
                }
            }
        });
        return new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED);
    }
}

共有1个答案

赵浩邈
2023-03-14

使用allOf组合一个模式中列出的所有模式。EmailRequestDTO和内联定义对象的属性都是作为参数生成的,而不是作为DTO生成的。看见https://swagger.io/docs/specification/data-models/oneof-anyof-allof-not/#allof

如果不希望将可选字符串生成为委托中的参数,请删除useOptionalconfiguration。看见https://openapi-generator.tech/docs/generators/spring/

 类似资料:
  • 问题内容: 有什么好的Eclipse插件来生成类图(用于项目)? 这里这张图片是 正是 我在说什么。 问题答案: 假设您打算声明“类图”而不是“项目层次结构”,那么我在职业生涯的各个阶段都使用了以下Eclipse插件来生成类图: ObjectAid。我目前的偏好。 来自Omondo的EclipseUML。现在似乎只有商业版本可用。您问题中的类图很可能是由该插件生成的。 强制链接 列出的工具不会从源

  • 问题内容: 我正在寻找用于Eclipse的UML插件。我知道这个问题已经被问过几次了,但是大多数都已经有几年了。从我的阅读中,我会说大多数人都喜欢eUML2,但这正式仅支持Helios。 到目前为止,我正在使用argoUML,但是,至少可以说,没有撤消按钮的确是可用性的噩梦。另外,我希望集成到Eclipse中。 我想要的是: 免费/开源 积极开发的工具(对Indigo的支持,对Juno的计划的支持

  • 问题内容: 我想使用Gradle任务为 Java 项目生成Java类,类似于Android插件如何使用表示法创建,例如: 用例是我正在开发一个开源应用程序,该应用程序需要使用API​​密钥和机密。我拥有不致力于我的VCS 的密钥和秘密。 到目前为止,我有这个: 并且有效- 在指定位置生成该文件。但是它非常脆弱。明确命名软件包很容易出错。只要文件可以在其他软件包中生成(例如,在的根目录),只要能够使

  • 在我的maven pom中,我还定义了javadoc插件,如下所示: 现在我在运行过程中得到了一些奇怪的输出 [信息]生成“Javadoc”报告--maven-javadoc-plugin:3.1.0:aggregate-no-fork[ERROR]错误提取链接:d:\work\eclipse\java\fritzbox\phplib\target\javadoc-bundle-options。忽

  • 问题内容: 13在我的本地设置中开始表现出非常奇怪的行为。 即,在添加到现有项目中的任何新类中,均不起作用。因此,在新类中声明任何类型的对象变量,然后键入该变量的名称,然后键入点号(。)之后,对于相应对象的任何方法都没有建议。 例如,在声明之后 键入不会显示该类中所有方法的列表,以便从中选择一个。实际上,当键入点(。)时,没有任何建议出现,并且在IDE窗口的左下角(状态栏中),显示消息“期望的标识