'Swagger OpenAPI Code Gen "oneOf" : How to generate correct class file?

TLDR:

Swagger offers a feature named 'oneOf'. The resulting java classes created do not seem to be correct.

Details:

I am creating the spring/java server side rest api code. And when I send a request. The request object is not parsed correctly. The following error is printed in the console.

JSON parse error: Could not resolve subtype of [simple type, class com.model.Issuer]: missing type id property 'type' (for POJO property 'issuer'); nested exception is com.fasterxml.jackson.databind.exc.InvalidTypeIdException: Could not resolve subtype of [simple type, class com.Issuer]: missing type id property 'type' (for POJO property 'issuer')\n at [Source: (PushbackInputStream); line: 3, column: 15] (through reference chain: com.IssueCredentialRequest[\"credential\"]->com.Credential[\"issuer\"])

The reason seem to be that the generated class does not have subtypes:

package com.sphereon.vdp.vc.service.model;


import com.fasterxml.jackson.annotation.JsonSubTypes;
import com.fasterxml.jackson.annotation.JsonTypeInfo;

@JsonTypeInfo(
  use = JsonTypeInfo.Id.NAME,
  include = JsonTypeInfo.As.PROPERTY,
  property = "type")
@JsonSubTypes({
})
public interface OneOfIssuer {

}

There is another class which is generated correctly

package com.sphereon.vdp.vc.service.model;

import com.fasterxml.jackson.annotation.JsonSubTypes;
import com.fasterxml.jackson.annotation.JsonTypeInfo;

@JsonTypeInfo(
  use = JsonTypeInfo.Id.NAME,
  include = JsonTypeInfo.As.PROPERTY,
  property = "type")
@JsonSubTypes({
  @JsonSubTypes.Type(value = VerifyPresentationRequest.class, name =     "VerifyPresentationRequest"),
  @JsonSubTypes.Type(value = ProoflessVerifyPresentationRequest.class, name = "ProoflessVerifyPresentationRequest")
})
public interface OneOfpresentationsVerifyBody {

}

Can someone point to what am I missing?

<plugin>
    <groupId>io.swagger.codegen.v3</groupId>
    <artifactId>swagger-codegen-maven-plugin</artifactId>
    <version>3.0.33</version>
    <dependencies>
      <dependency>
        <groupId>com.github.jknack</groupId>
        <artifactId>handlebars</artifactId>
        <version>4.3.0</version>
      </dependency>
    </dependencies>
    <executions>
      <execution>
        <id>vc-rest-api-issuer-source-generation</id>
        <goals>
          <goal>generate</goal>
        </goals>
        <phase>generate-sources</phase>
        <configuration>
          <inputSpec>${pom.basedir}/specifications/issuer.yml</inputSpec>

          <language>spring</language>

          <apiPackage>com.company.vdp.vc.service.api</apiPackage>
          <modelPackage>com.company.vdp.vc.service.model</modelPackage>
          <artifactVersion>${project.version}</artifactVersion>

          <generateModels>true</generateModels>
          <generateApis>true</generateApis>
          <generateModelDocumentation>true</generateModelDocumentation>
          <generateSupportingFiles>true</generateSupportingFiles>

          <verbose>${openapi-codegen-verbose}</verbose>
          <output>${project.basedir}/target/generated-sources/java/api</output>
          <ignoreFileOverride>${project.basedir}/target/generated-sources/java/api/.swagger-codegen-ignore</ignoreFileOverride>

          <configOptions>
            <delegatePattern>true</delegatePattern>
            <dateLibrary>java8</dateLibrary>
            <useTags>true</useTags>
          </configOptions>
        </configuration>
      </execution>
      <execution>
        <id>vc-rest-api-verifier-source-generation</id>
        <goals>
          <goal>generate</goal>
        </goals>
        <phase>generate-sources</phase>
        <configuration>
          <inputSpec>${pom.basedir}/specifications/verifier.yml</inputSpec>

          <language>spring</language>

          <apiPackage>com.company.vdp.vc.service.api</apiPackage>
          <modelPackage>com.company.vdp.vc.service.model</modelPackage>
          <artifactVersion>${project.version}</artifactVersion>

          <generateModels>true</generateModels>
          <generateApis>true</generateApis>
          <generateModelDocumentation>true</generateModelDocumentation>
          <generateSupportingFiles>true</generateSupportingFiles>

          <verbose>${openapi-codegen-verbose}</verbose>
          <output>${project.basedir}/target/generated-sources/java/api</output>
          <ignoreFileOverride>${project.basedir}/target/generated-sources/java/api/.swagger-codegen-ignore</ignoreFileOverride>

          <configOptions>
            <delegatePattern>true</delegatePattern>
            <dateLibrary>java8</dateLibrary>
            <useTags>true</useTags>
          </configOptions>
        </configuration>
      </execution>
    </executions>
  </plugin>

Following is the spec file that I am using without editing.

  1. https://github.com/w3c-ccg/vc-api/blob/main/components/Issuer.yml
  2. https://github.com/w3c-ccg/vc-api/blob/main/verifier.yml


Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source