swagger-api / swagger-api/swagger-codegen
[Bug]: String and Boolean and Int properties are being turned into Objects in OpenAPI 3.1.0
Nobody has claimed this yet.
- Dominant language
- Mustache
- Stars
- 17.8k
- Forks
- 6k
- PR merge metrics
- No merged PRs in 30d
Description
This is an issue specifically with OpenAPI Version 3.1.0. I am not having this issue with OpenAPI Version 3.0.X. My current workaround is to use OpenAPI 3.0.1.
I am using the Swagger Codegen Maven Plugin V3, version 3.0.71. I am using Java 21, Spring Boot 3.5.8. In my pom file I have the following configuration:
<plugin>
<groupId>io.swagger.codegen.v3</groupId>
<artifactId>swagger-codegen-maven-plugin</artifactId>
<version>3.0.71</version>
<executions>
<execution>
<id>my-project</id>
<goals>
<goal>generate</goal>
</goals>
<configuration>
<inputSpec>${project.baseUri}/src/main/resources/myproject.json</inputSpec>
<language>java</language>
<library>resttemplate</library>
<generateApis>false</generateApis>
<modelPackage>com.my.project.model</modelPackage>
<generateApiTests>false</generateApiTests>
<generateApiDocumentation>false</generateApiDocumentation>
<generateModelTests>false</generateModelTests>
<generateModelDocumentation>false</generateModelDocumentation>
<generateSupportingFiles>false</generateSupportingFiles>
<configOptions>
<interfaceOnly>true</interfaceOnly>
<dateLibrary>legacy</dateLibrary>
<hideGenerationTimestamp>true</hideGenerationTimestamp>
</configOptions>
</configuration>
</execution>
</executions>
</plugin>
I am expecting the input JSON file to generate Java files that will match the json. However, upon running mvn clean generate-sources, I keep seeing the following warning: "[WARNING] String to be sanitized is null. Default to Object"
Here is an example of one of the objects in the JSON schema:
"Doctor": {
"type": "object",
"properties": {
"code": {
"type": "string",
"format": "uuid"
},
"practiceName": {
"type": "string"
},
"address1": {
"type": "string"
},
"address2": {
"type": "string"
},
"address3": {
"type": "string"
},
"postalCode": {
"type": "string"
},
"townCity": {
"type": "string"
},
"regionCounty": {
"type": "string"
},
"country": {
"type": "string"
},
"email": {
"type": "string"
},
"phoneNumber": {
"type": "string"
},
"approved": {
"type": "boolean"
},
"externalId": {
"type": "integer",
"format": "int32"
},
"languageTag": {
"type": "string"
}
}
}
Okay, so you'd think that would product a Java object with properties matching the types described (strings, booleans). Instead, in the resulting Java object, every single property is just an Object.
public class Doctor {
@JsonProperty("code")
private Object code = null;
@JsonProperty("practiceName")
private Object practiceName = null;
@JsonProperty("address1")
private Object address1 = null;
@JsonProperty("address2")
private Object address2 = null;
@JsonProperty("address3")
private Object address3 = null;
@JsonProperty("postalCode")
private Object postalCode = null;
@JsonProperty("townCity")
private Object townCity = null;
@JsonProperty("regionCounty")
private Object regionCounty = null;
@JsonProperty("country")
private Object country = null;
@JsonProperty("email")
private Object email = null;
@JsonProperty("phoneNumber")
private Object phoneNumber = null;
@JsonProperty("approved")
private Object approved = null;
@JsonProperty("externalId")
private Object externalVetId = null;
@JsonProperty("languageTag")
private Object languageTag = null;
public Doctor code(Object code) {
this.code = code;
return this;
}
I want the properties (i.e. practiceName, country, etc.) to actually match what the schema has (i.e. both practiceName and country should be Strings).
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Start with the Maven plugin configuration, the OpenAPI 3.1 input JSON, and the generated Doctor.java after running mvn clean generate-sources. Trace the warning "String to be sanitized is null. Default to Object" and compare the generated property types with the schema; done means string, boolean, and integer properties are generated with matching Java types instead of Object.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- java
- Domain
- api, tooling
- Issue type
- Bug
- Difficulty
- 3/5
- Estimated time
- 1-2 days
- Activity status
- Stale
- Clarity
- Mostly clear
- Newbie friendliness
- 35/100