Add x-implements for java enums (#20778)

This commit is contained in:
jpfinne 2025-03-05 18:59:55 +01:00 committed by GitHub
parent 36b72052e6
commit ffa196e6a9
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
13 changed files with 69 additions and 10 deletions

View File

@ -1113,7 +1113,7 @@ public class JavaClientCodegen extends AbstractJavaCodegen
cm.anyOf.remove("ModelNull"); cm.anyOf.remove("ModelNull");
} }
} }
if (this.parcelableModel) { if (this.parcelableModel && !cm.isEnum) {
((ArrayList<String>) cm.getVendorExtensions().get("x-implements")).add("Parcelable"); ((ArrayList<String>) cm.getVendorExtensions().get("x-implements")).add("Parcelable");
} }
} }

View File

@ -8,7 +8,7 @@
@JsonbTypeDeserializer({{datatypeWithEnum}}.Deserializer.class) @JsonbTypeDeserializer({{datatypeWithEnum}}.Deserializer.class)
{{/jsonb}} {{/jsonb}}
{{/withXml}} {{/withXml}}
{{>additionalEnumTypeAnnotations}}public enum {{datatypeWithEnum}} { {{>additionalEnumTypeAnnotations}}public enum {{datatypeWithEnum}}{{#vendorExtensions.x-implements}}{{#-first}} implements {{{.}}}{{/-first}}{{^-first}}, {{{.}}}{{/-first}}{{/vendorExtensions.x-implements}} {
{{#allowableValues}} {{#allowableValues}}
{{#withXml}} {{#withXml}}

View File

@ -13,7 +13,7 @@ import java.net.URI;
@JsonbTypeSerializer({{{datatypeWithEnum}}}{{^datatypeWithEnum}}{{{classname}}}{{/datatypeWithEnum}}.Serializer.class) @JsonbTypeSerializer({{{datatypeWithEnum}}}{{^datatypeWithEnum}}{{{classname}}}{{/datatypeWithEnum}}.Serializer.class)
@JsonbTypeDeserializer({{{datatypeWithEnum}}}{{^datatypeWithEnum}}{{{classname}}}{{/datatypeWithEnum}}.Deserializer.class) @JsonbTypeDeserializer({{{datatypeWithEnum}}}{{^datatypeWithEnum}}{{{classname}}}{{/datatypeWithEnum}}.Deserializer.class)
{{/jsonb}} {{/jsonb}}
{{>additionalEnumTypeAnnotations}}public enum {{{datatypeWithEnum}}}{{^datatypeWithEnum}}{{{classname}}}{{/datatypeWithEnum}} { {{>additionalEnumTypeAnnotations}}public enum {{{datatypeWithEnum}}}{{^datatypeWithEnum}}{{{classname}}}{{/datatypeWithEnum}}{{#vendorExtensions.x-implements}}{{#-first}} implements {{{.}}}{{/-first}}{{^-first}}, {{{.}}}{{/-first}}{{/vendorExtensions.x-implements}} {
{{#gson}} {{#gson}}
{{#allowableValues}}{{#enumVars}} {{#allowableValues}}{{#enumVars}}
@SerializedName({{#isInteger}}"{{/isInteger}}{{#isDouble}}"{{/isDouble}}{{#isLong}}"{{/isLong}}{{#isFloat}}"{{/isFloat}}{{{value}}}{{#isInteger}}"{{/isInteger}}{{#isDouble}}"{{/isDouble}}{{#isLong}}"{{/isLong}}{{#isFloat}}"{{/isFloat}}) @SerializedName({{#isInteger}}"{{/isInteger}}{{#isDouble}}"{{/isDouble}}{{#isLong}}"{{/isLong}}{{#isFloat}}"{{/isFloat}}{{{value}}}{{#isInteger}}"{{/isInteger}}{{#isDouble}}"{{/isDouble}}{{#isLong}}"{{/isLong}}{{#isFloat}}"{{/isFloat}})

View File

@ -23,7 +23,7 @@ import java.net.URI;
@JsonbTypeSerializer({{datatypeWithEnum}}.Serializer.class) @JsonbTypeSerializer({{datatypeWithEnum}}.Serializer.class)
@JsonbTypeDeserializer({{datatypeWithEnum}}.Deserializer.class) @JsonbTypeDeserializer({{datatypeWithEnum}}.Deserializer.class)
{{/jsonb}} {{/jsonb}}
{{>additionalEnumTypeAnnotations}}public enum {{{datatypeWithEnum}}}{{^datatypeWithEnum}}{{{classname}}}{{/datatypeWithEnum}} { {{>additionalEnumTypeAnnotations}}public enum {{{datatypeWithEnum}}}{{^datatypeWithEnum}}{{{classname}}}{{/datatypeWithEnum}}{{#vendorExtensions.x-implements}}{{#-first}} implements {{{.}}}{{/-first}}{{^-first}}, {{{.}}}{{/-first}}{{/vendorExtensions.x-implements}} {
{{#allowableValues}}{{#enumVars}} {{#allowableValues}}{{#enumVars}}
{{#enumDescription}} {{#enumDescription}}
/** /**

View File

@ -12,7 +12,7 @@ import com.google.gson.stream.JsonWriter;
* {{description}}{{^description}}Gets or Sets {{{name}}}{{/description}} * {{description}}{{^description}}Gets or Sets {{{name}}}{{/description}}
*/ */
@JsonAdapter({{{datatypeWithEnum}}}{{^datatypeWithEnum}}{{{classname}}}{{/datatypeWithEnum}}.Adapter.class) @JsonAdapter({{{datatypeWithEnum}}}{{^datatypeWithEnum}}{{{classname}}}{{/datatypeWithEnum}}.Adapter.class)
{{>additionalEnumTypeAnnotations}}public enum {{{datatypeWithEnum}}}{{^datatypeWithEnum}}{{{classname}}}{{/datatypeWithEnum}} { {{>additionalEnumTypeAnnotations}}public enum {{{datatypeWithEnum}}}{{^datatypeWithEnum}}{{{classname}}}{{/datatypeWithEnum}}{{#vendorExtensions.x-implements}}{{#-first}} implements {{{.}}}{{/-first}}{{^-first}}, {{{.}}}{{/-first}}{{/vendorExtensions.x-implements}} {
{{#allowableValues}}{{#enumVars}} {{#allowableValues}}{{#enumVars}}
{{#enumDescription}} {{#enumDescription}}
/** /**

View File

@ -6,7 +6,7 @@
@XmlType(name="{{datatypeWithEnum}}") @XmlType(name="{{datatypeWithEnum}}")
@XmlEnum({{dataType}}.class) @XmlEnum({{dataType}}.class)
{{/withXml}} {{/withXml}}
{{>additionalEnumTypeAnnotations}}public enum {{{datatypeWithEnum}}}{{^datatypeWithEnum}}{{classname}}{{/datatypeWithEnum}} { {{>additionalEnumTypeAnnotations}}public enum {{{datatypeWithEnum}}}{{^datatypeWithEnum}}{{classname}}{{/datatypeWithEnum}}{{#vendorExtensions.x-implements}}{{#-first}} implements {{{.}}}{{/-first}}{{^-first}}, {{{.}}}{{/-first}}{{/vendorExtensions.x-implements}} {
{{#allowableValues}} {{#allowableValues}}
{{#enumVars}} {{#enumVars}}
{{#enumDescription}} {{#enumDescription}}

View File

@ -23,7 +23,7 @@ import java.net.URI;
@JsonbTypeSerializer({{datatypeWithEnum}}.Serializer.class) @JsonbTypeSerializer({{datatypeWithEnum}}.Serializer.class)
@JsonbTypeDeserializer({{datatypeWithEnum}}.Deserializer.class) @JsonbTypeDeserializer({{datatypeWithEnum}}.Deserializer.class)
{{/jsonb}} {{/jsonb}}
{{>additionalEnumTypeAnnotations}}public enum {{{datatypeWithEnum}}}{{^datatypeWithEnum}}{{{classname}}}{{/datatypeWithEnum}} { {{>additionalEnumTypeAnnotations}}public enum {{{datatypeWithEnum}}}{{^datatypeWithEnum}}{{{classname}}}{{/datatypeWithEnum}}{{#vendorExtensions.x-implements}}{{#-first}} implements {{{.}}}{{/-first}}{{^-first}}, {{{.}}}{{/-first}}{{/vendorExtensions.x-implements}} {
{{#allowableValues}}{{#enumVars}} {{#allowableValues}}{{#enumVars}}
{{#enumDescription}} {{#enumDescription}}
/** /**

View File

@ -12,7 +12,7 @@
@XmlType(name="{{datatypeWithEnum}}") @XmlType(name="{{datatypeWithEnum}}")
@XmlEnum({{dataType}}.class) @XmlEnum({{dataType}}.class)
{{/withXml}} {{/withXml}}
{{>additionalEnumTypeAnnotations}}public enum {{{datatypeWithEnum}}}{{^datatypeWithEnum}}{{classname}}{{/datatypeWithEnum}} { {{>additionalEnumTypeAnnotations}}public enum {{{datatypeWithEnum}}}{{^datatypeWithEnum}}{{classname}}{{/datatypeWithEnum}}{{#vendorExtensions.x-implements}}{{#-first}} implements {{{.}}}{{/-first}}{{^-first}}, {{{.}}}{{/-first}}{{/vendorExtensions.x-implements}} {
{{#allowableValues}} {{#allowableValues}}
{{#enumVars}} {{#enumVars}}
{{#enumDescription}} {{#enumDescription}}

View File

@ -1,7 +1,7 @@
/** /**
* {{^description}}Gets or Sets {{{name}}}{{/description}}{{{description}}} * {{^description}}Gets or Sets {{{name}}}{{/description}}{{{description}}}
*/ */
{{>additionalEnumTypeAnnotations}}public enum {{{datatypeWithEnum}}}{{^datatypeWithEnum}}{{classname}}{{/datatypeWithEnum}} { {{>additionalEnumTypeAnnotations}}public enum {{{datatypeWithEnum}}}{{^datatypeWithEnum}}{{classname}}{{/datatypeWithEnum}}{{#vendorExtensions.x-implements}}{{#-first}} implements {{{.}}}{{/-first}}{{^-first}}, {{{.}}}{{/-first}}{{/vendorExtensions.x-implements}} {
{{#gson}} {{#gson}}
{{#allowableValues}} {{#allowableValues}}
{{#enumVars}} {{#enumVars}}

View File

@ -8,7 +8,7 @@ import com.fasterxml.jackson.annotation.JsonValue;
*/ */
{{>additionalEnumTypeAnnotations}} {{>additionalEnumTypeAnnotations}}
{{>generatedAnnotation}} {{>generatedAnnotation}}
public enum {{{datatypeWithEnum}}}{{^datatypeWithEnum}}{{{classname}}}{{/datatypeWithEnum}} { public enum {{{datatypeWithEnum}}}{{^datatypeWithEnum}}{{{classname}}}{{/datatypeWithEnum}}{{#vendorExtensions.x-implements}}{{#-first}} implements {{{.}}}{{/-first}}{{^-first}}, {{{.}}}{{/-first}}{{/vendorExtensions.x-implements}} {
{{#gson}} {{#gson}}
{{#allowableValues}}{{#enumVars}} {{#allowableValues}}{{#enumVars}}
{{#enumDescription}} {{#enumDescription}}

View File

@ -3463,4 +3463,17 @@ public class JavaClientCodegenTest {
"responseBody.isBlank()? null: memberVarObjectMapper.readValue(responseBody, new TypeReference<LocationData>() {})" "responseBody.isBlank()? null: memberVarObjectMapper.readValue(responseBody, new TypeReference<LocationData>() {})"
); );
} }
@Test
public void testEnumWithImplements() {
final Path output = newTempFolder();
final OpenAPI openAPI = TestUtils.parseFlattenSpec("src/test/resources/3_0/enum-implements.yaml");
JavaClientCodegen codegen = new JavaClientCodegen();
codegen.setOutputDir(output.toString());
Map<String, File> files = new DefaultGenerator().opts(new ClientOptInput().openAPI(openAPI).config(codegen))
.generate().stream().collect(Collectors.toMap(File::getName, Function.identity()));
JavaFileAssert.assertThat(files.get("Type.java")).fileContains("Type implements org.openapitools.java.EnumInterface {");
}
} }

View File

@ -5370,4 +5370,17 @@ public class SpringCodegenTest {
"this.name = Optional.of(name);" "this.name = Optional.of(name);"
); );
} }
@Test
public void testEnumWithImplements() {
final Path output = newTempFolder();
final OpenAPI openAPI = TestUtils.parseFlattenSpec("src/test/resources/3_0/enum-implements.yaml");
SpringCodegen codegen = new SpringCodegen();
codegen.setOutputDir(output.toString());
Map<String, File> files = new DefaultGenerator().opts(new ClientOptInput().openAPI(openAPI).config(codegen))
.generate().stream().collect(Collectors.toMap(File::getName, Function.identity()));
JavaFileAssert.assertThat(files.get("Type.java")).fileContains("Type implements org.openapitools.java.EnumInterface {");
}
} }

View File

@ -0,0 +1,33 @@
openapi: 3.0.0
info:
title: Sample API
description: API description in Markdown.
version: 1.0.0
paths:
/ponies:
get:
summary: Returns all animals.
description: Optional extended description in Markdown.
responses:
200:
description: OK
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/Pony'
components:
schemas:
Pony:
type: object
properties:
type:
$ref: '#/components/schemas/Type'
Type:
type: string
x-implements: org.openapitools.java.EnumInterface
enum:
- Earth
- Pegasi
- Unicorn