Forum Discussion

zur's avatar
zur
New Contributor
4 years ago

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.