forked from loafle/openapi-generator-original
[Micronaut] Improving micronaut-model and micronaut-client generation (#14065)
* fix documentation * improve build.gradle.mustache and pom.xml.mustache to assume different serialization libs jackson or micronaut-serde-jackson * improve pojo.mustache to skip generating @JsonDeserialize as for micronaut-serde-jackson * improve model generating by removing visible flag from @JsonTypeInfo as it is not supported by micronaut-serde-jackson Co-authored-by: dmitry.kubakhov <dmitry.kubakhov@check24.de>
This commit is contained in:
parent
90a8b4effb
commit
f9d4d28f48
@ -18,6 +18,7 @@ These options may be applied as additional-properties (cli) or configOptions (pl
|
|||||||
|
|
||||||
| Option | Description | Values | Default |
|
| Option | Description | Values | Default |
|
||||||
| ------ | ----------- | ------ | ------- |
|
| ------ | ----------- | ------ | ------- |
|
||||||
|
|additionalClientTypeAnnotations|Additional annotations for client type(class level annotations). List separated by semicolon(;) or new line (Linux or Windows)| |null|
|
||||||
|additionalEnumTypeAnnotations|Additional annotations for enum type(class level annotations)| |null|
|
|additionalEnumTypeAnnotations|Additional annotations for enum type(class level annotations)| |null|
|
||||||
|additionalModelTypeAnnotations|Additional annotations for model type(class level annotations). List separated by semicolon(;) or new line (Linux or Windows)| |null|
|
|additionalModelTypeAnnotations|Additional annotations for model type(class level annotations). List separated by semicolon(;) or new line (Linux or Windows)| |null|
|
||||||
|additionalOneOfTypeAnnotations|Additional annotations for oneOf interfaces(class level annotations). List separated by semicolon(;) or new line (Linux or Windows)| |null|
|
|additionalOneOfTypeAnnotations|Additional annotations for oneOf interfaces(class level annotations). List separated by semicolon(;) or new line (Linux or Windows)| |null|
|
||||||
@ -70,6 +71,7 @@ These options may be applied as additional-properties (cli) or configOptions (pl
|
|||||||
|scmDeveloperConnection|SCM developer connection in generated pom.xml| |scm:git:git@github.com:openapitools/openapi-generator.git|
|
|scmDeveloperConnection|SCM developer connection in generated pom.xml| |scm:git:git@github.com:openapitools/openapi-generator.git|
|
||||||
|scmUrl|SCM URL in generated pom.xml| |https://github.com/openapitools/openapi-generator|
|
|scmUrl|SCM URL in generated pom.xml| |https://github.com/openapitools/openapi-generator|
|
||||||
|serializableModel|boolean - toggle "implements Serializable" for generated models| |false|
|
|serializableModel|boolean - toggle "implements Serializable" for generated models| |false|
|
||||||
|
|serializationLibrary|Serialization library for model|<dl><dt>**jackson**</dt><dd>Jackson as serialization library</dd><dt>**micronaut_serde_jackson**</dt><dd>Use micronaut-serialization with Jackson annotations</dd></dl>|jackson|
|
||||||
|snapshotVersion|Uses a SNAPSHOT version.|<dl><dt>**true**</dt><dd>Use a SnapShot Version</dd><dt>**false**</dt><dd>Use a Release Version</dd></dl>|null|
|
|snapshotVersion|Uses a SNAPSHOT version.|<dl><dt>**true**</dt><dd>Use a SnapShot Version</dd><dt>**false**</dt><dd>Use a Release Version</dd></dl>|null|
|
||||||
|sortModelPropertiesByRequiredFlag|Sort model properties to place required parameters before optional parameters.| |true|
|
|sortModelPropertiesByRequiredFlag|Sort model properties to place required parameters before optional parameters.| |true|
|
||||||
|sortParamsByRequiredFlag|Sort method arguments to place required parameters before optional parameters.| |true|
|
|sortParamsByRequiredFlag|Sort method arguments to place required parameters before optional parameters.| |true|
|
||||||
|
@ -72,6 +72,7 @@ These options may be applied as additional-properties (cli) or configOptions (pl
|
|||||||
|scmDeveloperConnection|SCM developer connection in generated pom.xml| |scm:git:git@github.com:openapitools/openapi-generator.git|
|
|scmDeveloperConnection|SCM developer connection in generated pom.xml| |scm:git:git@github.com:openapitools/openapi-generator.git|
|
||||||
|scmUrl|SCM URL in generated pom.xml| |https://github.com/openapitools/openapi-generator|
|
|scmUrl|SCM URL in generated pom.xml| |https://github.com/openapitools/openapi-generator|
|
||||||
|serializableModel|boolean - toggle "implements Serializable" for generated models| |false|
|
|serializableModel|boolean - toggle "implements Serializable" for generated models| |false|
|
||||||
|
|serializationLibrary|Serialization library for model|<dl><dt>**jackson**</dt><dd>Jackson as serialization library</dd><dt>**micronaut_serde_jackson**</dt><dd>Use micronaut-serialization with Jackson annotations</dd></dl>|jackson|
|
||||||
|snapshotVersion|Uses a SNAPSHOT version.|<dl><dt>**true**</dt><dd>Use a SnapShot Version</dd><dt>**false**</dt><dd>Use a Release Version</dd></dl>|null|
|
|snapshotVersion|Uses a SNAPSHOT version.|<dl><dt>**true**</dt><dd>Use a SnapShot Version</dd><dt>**false**</dt><dd>Use a Release Version</dd></dl>|null|
|
||||||
|sortModelPropertiesByRequiredFlag|Sort model properties to place required parameters before optional parameters.| |true|
|
|sortModelPropertiesByRequiredFlag|Sort model properties to place required parameters before optional parameters.| |true|
|
||||||
|sortParamsByRequiredFlag|Sort method arguments to place required parameters before optional parameters.| |true|
|
|sortParamsByRequiredFlag|Sort method arguments to place required parameters before optional parameters.| |true|
|
||||||
|
@ -53,6 +53,7 @@ public abstract class JavaMicronautAbstractCodegen extends AbstractJavaCodegen i
|
|||||||
public static final String OPT_GENERATE_SWAGGER_ANNOTATIONS_TRUE = "true";
|
public static final String OPT_GENERATE_SWAGGER_ANNOTATIONS_TRUE = "true";
|
||||||
public static final String OPT_GENERATE_SWAGGER_ANNOTATIONS_FALSE = "false";
|
public static final String OPT_GENERATE_SWAGGER_ANNOTATIONS_FALSE = "false";
|
||||||
public static final String OPT_GENERATE_OPERATION_ONLY_FOR_FIRST_TAG = "generateOperationOnlyForFirstTag";
|
public static final String OPT_GENERATE_OPERATION_ONLY_FOR_FIRST_TAG = "generateOperationOnlyForFirstTag";
|
||||||
|
public enum SERIALIZATION_LIBRARY_TYPE {jackson, micronaut_serde_jackson}
|
||||||
|
|
||||||
protected final Logger LOGGER = LoggerFactory.getLogger(JavaMicronautAbstractCodegen.class);
|
protected final Logger LOGGER = LoggerFactory.getLogger(JavaMicronautAbstractCodegen.class);
|
||||||
|
|
||||||
@ -69,6 +70,7 @@ public abstract class JavaMicronautAbstractCodegen extends AbstractJavaCodegen i
|
|||||||
protected String appName;
|
protected String appName;
|
||||||
protected String generateSwaggerAnnotations;
|
protected String generateSwaggerAnnotations;
|
||||||
protected boolean generateOperationOnlyForFirstTag;
|
protected boolean generateOperationOnlyForFirstTag;
|
||||||
|
protected String serializationLibrary = SERIALIZATION_LIBRARY_TYPE.jackson.name();
|
||||||
|
|
||||||
public static final String CONTENT_TYPE_APPLICATION_FORM_URLENCODED = "application/x-www-form-urlencoded";
|
public static final String CONTENT_TYPE_APPLICATION_FORM_URLENCODED = "application/x-www-form-urlencoded";
|
||||||
public static final String CONTENT_TYPE_APPLICATION_JSON = "application/json";
|
public static final String CONTENT_TYPE_APPLICATION_JSON = "application/json";
|
||||||
@ -123,7 +125,6 @@ public abstract class JavaMicronautAbstractCodegen extends AbstractJavaCodegen i
|
|||||||
);
|
);
|
||||||
|
|
||||||
// Set additional properties
|
// Set additional properties
|
||||||
additionalProperties.put("jackson", "true");
|
|
||||||
additionalProperties.put("openbrace", "{");
|
additionalProperties.put("openbrace", "{");
|
||||||
additionalProperties.put("closebrace", "}");
|
additionalProperties.put("closebrace", "}");
|
||||||
|
|
||||||
@ -180,6 +181,14 @@ public abstract class JavaMicronautAbstractCodegen extends AbstractJavaCodegen i
|
|||||||
opt.setEnum(valuesEnum);
|
opt.setEnum(valuesEnum);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
final CliOption serializationLibraryOpt = CliOption.newString(CodegenConstants.SERIALIZATION_LIBRARY, "Serialization library for model");
|
||||||
|
serializationLibraryOpt.defaultValue(SERIALIZATION_LIBRARY_TYPE.jackson.name());
|
||||||
|
Map<String, String> serializationLibraryOptions = new HashMap<>();
|
||||||
|
serializationLibraryOptions.put(SERIALIZATION_LIBRARY_TYPE.jackson.name(), "Jackson as serialization library");
|
||||||
|
serializationLibraryOptions.put(SERIALIZATION_LIBRARY_TYPE.micronaut_serde_jackson.name(), "Use micronaut-serialization with Jackson annotations");
|
||||||
|
serializationLibraryOpt.setEnum(serializationLibraryOptions);
|
||||||
|
cliOptions.add(serializationLibraryOpt);
|
||||||
|
|
||||||
// Add reserved words
|
// Add reserved words
|
||||||
String[] reservedWordsArray = {
|
String[] reservedWordsArray = {
|
||||||
"client", "format", "queryvalue", "queryparam", "pathvariable", "header", "cookie",
|
"client", "format", "queryvalue", "queryparam", "pathvariable", "header", "cookie",
|
||||||
@ -305,6 +314,11 @@ public abstract class JavaMicronautAbstractCodegen extends AbstractJavaCodegen i
|
|||||||
additionalProperties.put("generateSwagger2Annotations", true);
|
additionalProperties.put("generateSwagger2Annotations", true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (additionalProperties.containsKey(CodegenConstants.SERIALIZATION_LIBRARY)) {
|
||||||
|
setSerializationLibrary((String) additionalProperties.get(CodegenConstants.SERIALIZATION_LIBRARY));
|
||||||
|
}
|
||||||
|
additionalProperties.put(this.serializationLibrary, true);
|
||||||
|
|
||||||
// Add all the supporting files
|
// Add all the supporting files
|
||||||
String resourceFolder = projectFolder + "/resources";
|
String resourceFolder = projectFolder + "/resources";
|
||||||
supportingFiles.add(new SupportingFile("common/configuration/application.yml.mustache", resourceFolder, "application.yml").doNotOverwrite());
|
supportingFiles.add(new SupportingFile("common/configuration/application.yml.mustache", resourceFolder, "application.yml").doNotOverwrite());
|
||||||
@ -710,4 +724,16 @@ public abstract class JavaMicronautAbstractCodegen extends AbstractJavaCodegen i
|
|||||||
writer.write(fragment.execute().replace('.', '_'));
|
writer.write(fragment.execute().replace('.', '_'));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void setSerializationLibrary(final String serializationLibrary) {
|
||||||
|
try {
|
||||||
|
this.serializationLibrary = JavaMicronautAbstractCodegen.SERIALIZATION_LIBRARY_TYPE.valueOf(serializationLibrary).name();
|
||||||
|
} catch (IllegalArgumentException ex) {
|
||||||
|
StringBuilder sb = new StringBuilder(serializationLibrary + " is an invalid enum property naming option. Please choose from:");
|
||||||
|
for (JavaMicronautAbstractCodegen.SERIALIZATION_LIBRARY_TYPE availableSerializationLibrary : JavaMicronautAbstractCodegen.SERIALIZATION_LIBRARY_TYPE.values()) {
|
||||||
|
sb.append("\n ").append(availableSerializationLibrary.name());
|
||||||
|
}
|
||||||
|
throw new RuntimeException(sb.toString());
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,8 @@
|
|||||||
package org.openapitools.codegen.languages;
|
package org.openapitools.codegen.languages;
|
||||||
|
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
import org.openapitools.codegen.CliOption;
|
import org.openapitools.codegen.CliOption;
|
||||||
import org.openapitools.codegen.CodegenType;
|
import org.openapitools.codegen.CodegenType;
|
||||||
import org.openapitools.codegen.SupportingFile;
|
import org.openapitools.codegen.SupportingFile;
|
||||||
@ -10,10 +13,12 @@ import org.openapitools.codegen.meta.Stability;
|
|||||||
public class JavaMicronautClientCodegen extends JavaMicronautAbstractCodegen {
|
public class JavaMicronautClientCodegen extends JavaMicronautAbstractCodegen {
|
||||||
|
|
||||||
public static final String OPT_CONFIGURE_AUTH = "configureAuth";
|
public static final String OPT_CONFIGURE_AUTH = "configureAuth";
|
||||||
|
public static final String ADDITIONAL_CLIENT_TYPE_ANNOTATIONS = "additionalClientTypeAnnotations";
|
||||||
|
|
||||||
public static final String NAME = "java-micronaut-client";
|
public static final String NAME = "java-micronaut-client";
|
||||||
|
|
||||||
protected boolean configureAuthorization;
|
protected boolean configureAuthorization;
|
||||||
|
protected List<String> additionalClientTypeAnnotations;
|
||||||
|
|
||||||
public JavaMicronautClientCodegen() {
|
public JavaMicronautClientCodegen() {
|
||||||
super();
|
super();
|
||||||
@ -27,6 +32,7 @@ public class JavaMicronautClientCodegen extends JavaMicronautAbstractCodegen {
|
|||||||
additionalProperties.put("client", "true");
|
additionalProperties.put("client", "true");
|
||||||
|
|
||||||
cliOptions.add(CliOption.newBoolean(OPT_CONFIGURE_AUTH, "Configure all the authorization methods as specified in the file", configureAuthorization));
|
cliOptions.add(CliOption.newBoolean(OPT_CONFIGURE_AUTH, "Configure all the authorization methods as specified in the file", configureAuthorization));
|
||||||
|
cliOptions.add(CliOption.newString(ADDITIONAL_CLIENT_TYPE_ANNOTATIONS, "Additional annotations for client type(class level annotations). List separated by semicolon(;) or new line (Linux or Windows)"));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -75,6 +81,12 @@ public class JavaMicronautClientCodegen extends JavaMicronautAbstractCodegen {
|
|||||||
supportingFiles.add(new SupportingFile("client/auth/configuration/HttpBasicAuthConfiguration.mustache", authConfigurationFolder, "HttpBasicAuthConfiguration.java"));
|
supportingFiles.add(new SupportingFile("client/auth/configuration/HttpBasicAuthConfiguration.mustache", authConfigurationFolder, "HttpBasicAuthConfiguration.java"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (additionalProperties.containsKey(ADDITIONAL_CLIENT_TYPE_ANNOTATIONS)) {
|
||||||
|
String additionalClientAnnotationsList = additionalProperties.get(ADDITIONAL_CLIENT_TYPE_ANNOTATIONS).toString();
|
||||||
|
this.setAdditionalClientTypeAnnotations(Arrays.asList(additionalClientAnnotationsList.trim().split("\\s*(;|\\r?\\n)\\s*")));
|
||||||
|
additionalProperties.put(ADDITIONAL_CLIENT_TYPE_ANNOTATIONS, additionalClientTypeAnnotations);
|
||||||
|
}
|
||||||
|
|
||||||
// Api file
|
// Api file
|
||||||
apiTemplateFiles.clear();
|
apiTemplateFiles.clear();
|
||||||
apiTemplateFiles.put("client/api.mustache", ".java");
|
apiTemplateFiles.put("client/api.mustache", ".java");
|
||||||
@ -93,4 +105,8 @@ public class JavaMicronautClientCodegen extends JavaMicronautAbstractCodegen {
|
|||||||
apiDocTemplateFiles.clear();
|
apiDocTemplateFiles.clear();
|
||||||
apiDocTemplateFiles.put("client/doc/api_doc.mustache", ".md");
|
apiDocTemplateFiles.put("client/doc/api_doc.mustache", ".md");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void setAdditionalClientTypeAnnotations(final List<String> additionalClientTypeAnnotations) {
|
||||||
|
this.additionalClientTypeAnnotations = additionalClientTypeAnnotations;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -41,6 +41,9 @@ import io.swagger.v3.oas.annotations.tags.Tag;
|
|||||||
import io.swagger.v3.oas.annotations.security.SecurityRequirement;
|
import io.swagger.v3.oas.annotations.security.SecurityRequirement;
|
||||||
{{/generateSwagger2Annotations}}
|
{{/generateSwagger2Annotations}}
|
||||||
|
|
||||||
|
{{#additionalClientTypeAnnotations}}
|
||||||
|
{{{.}}}
|
||||||
|
{{/additionalClientTypeAnnotations}}
|
||||||
{{>common/generatedAnnotation}}
|
{{>common/generatedAnnotation}}
|
||||||
@Client("${{openbrace}}{{{applicationName}}}-base-path{{closebrace}}")
|
@Client("${{openbrace}}{{{applicationName}}}-base-path{{closebrace}}")
|
||||||
public interface {{classname}} {
|
public interface {{classname}} {
|
||||||
|
@ -33,6 +33,10 @@ dependencies {
|
|||||||
{{#useAuth}}
|
{{#useAuth}}
|
||||||
annotationProcessor("io.micronaut.security:micronaut-security-annotations")
|
annotationProcessor("io.micronaut.security:micronaut-security-annotations")
|
||||||
{{/useAuth}}
|
{{/useAuth}}
|
||||||
|
{{#micronaut_serde_jackson}}
|
||||||
|
annotationProcessor("io.micronaut.serde:micronaut-serde-processor")
|
||||||
|
implementation("io.micronaut.serde:micronaut-serde-jackson")
|
||||||
|
{{/micronaut_serde_jackson}}
|
||||||
implementation("io.micronaut:micronaut-http-client")
|
implementation("io.micronaut:micronaut-http-client")
|
||||||
implementation("io.micronaut:micronaut-runtime")
|
implementation("io.micronaut:micronaut-runtime")
|
||||||
implementation("io.micronaut:micronaut-validation")
|
implementation("io.micronaut:micronaut-validation")
|
||||||
@ -51,6 +55,15 @@ dependencies {
|
|||||||
{{/generateSwagger2Annotations}}
|
{{/generateSwagger2Annotations}}
|
||||||
runtimeOnly("ch.qos.logback:logback-classic")
|
runtimeOnly("ch.qos.logback:logback-classic")
|
||||||
}
|
}
|
||||||
|
{{#micronaut_serde_jackson}}
|
||||||
|
// TODO Please, check the version of the serde, maybe it must be upgraded.
|
||||||
|
configurations.all {
|
||||||
|
resolutionStrategy.dependencySubstitution {
|
||||||
|
substitute(module("io.micronaut:micronaut-jackson-databind"))
|
||||||
|
.using(module("io.micronaut.serde:micronaut-serde-jackson:1.3.3"))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
{{/micronaut_serde_jackson}}
|
||||||
|
|
||||||
// TODO Set the main class
|
// TODO Set the main class
|
||||||
application {
|
application {
|
||||||
|
@ -141,6 +141,24 @@
|
|||||||
<version>${swagger-annotations-version}</version>
|
<version>${swagger-annotations-version}</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
{{/generateSwagger2Annotations}}
|
{{/generateSwagger2Annotations}}
|
||||||
|
{{#micronaut_serde_jackson}}
|
||||||
|
<dependency>
|
||||||
|
<groupId>io.micronaut</groupId>
|
||||||
|
<artifactId>micronaut-runtime</artifactId>
|
||||||
|
<scope>compile</scope>
|
||||||
|
<exclusions>
|
||||||
|
<exclusion>
|
||||||
|
<groupId>io.micronaut</groupId>
|
||||||
|
<artifactId>micronaut-jackson-databind</artifactId>
|
||||||
|
</exclusion>
|
||||||
|
</exclusions>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>io.micronaut.serde</groupId>
|
||||||
|
<artifactId>micronaut-serde-jackson</artifactId>
|
||||||
|
<scope>compile</scope>
|
||||||
|
</dependency>
|
||||||
|
{{/micronaut_serde_jackson}}
|
||||||
</dependencies>
|
</dependencies>
|
||||||
|
|
||||||
<build>
|
<build>
|
||||||
@ -170,6 +188,13 @@
|
|||||||
<version>${micronaut.security.version}</version>
|
<version>${micronaut.security.version}</version>
|
||||||
</path>
|
</path>
|
||||||
{{/useAuth}}
|
{{/useAuth}}
|
||||||
|
{{#micronaut_serde_jackson}}
|
||||||
|
<path>
|
||||||
|
<groupId>io.micronaut.serde</groupId>
|
||||||
|
<artifactId>micronaut-serde-processor</artifactId>
|
||||||
|
<version>${micronaut.serialization.version}</version>
|
||||||
|
</path>
|
||||||
|
{{/micronaut_serde_jackson}}
|
||||||
</annotationProcessorPaths>
|
</annotationProcessorPaths>
|
||||||
<compilerArgs>
|
<compilerArgs>
|
||||||
<arg>-Amicronaut.processing.group={{groupId}}</arg>
|
<arg>-Amicronaut.processing.group={{groupId}}</arg>
|
||||||
|
@ -18,9 +18,19 @@
|
|||||||
{{/isXmlWrapped}}
|
{{/isXmlWrapped}}
|
||||||
{{/isContainer}}
|
{{/isContainer}}
|
||||||
{{/withXml}}
|
{{/withXml}}
|
||||||
{{#isDateTime}}
|
{{#jackson}}
|
||||||
|
{{#isDateTime}}
|
||||||
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "{{{datetimeFormat}}}")
|
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "{{{datetimeFormat}}}")
|
||||||
{{/isDateTime}}
|
{{/isDateTime}}
|
||||||
{{#isDate}}
|
{{#isDate}}
|
||||||
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "{{{dateFormat}}}")
|
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "{{{dateFormat}}}")
|
||||||
{{/isDate}}
|
{{/isDate}}
|
||||||
|
{{/jackson}}
|
||||||
|
{{#micronaut_serde_jackson}}
|
||||||
|
{{#isDateTime}}
|
||||||
|
@JsonFormat(pattern = "{{{datetimeFormat}}}")
|
||||||
|
{{/isDateTime}}
|
||||||
|
{{#isDate}}
|
||||||
|
@JsonFormat(pattern = "{{{dateFormat}}}")
|
||||||
|
{{/isDate}}
|
||||||
|
{{/micronaut_serde_jackson}}
|
@ -9,6 +9,9 @@
|
|||||||
@Schema({{#name}}name = "{{name}}", {{/name}}description = "{{{description}}}")
|
@Schema({{#name}}name = "{{name}}", {{/name}}description = "{{{description}}}")
|
||||||
{{/generateSwagger2Annotations}}
|
{{/generateSwagger2Annotations}}
|
||||||
{{/description}}
|
{{/description}}
|
||||||
|
{{#micronaut_serde_jackson}}
|
||||||
|
@io.micronaut.serde.annotation.Serdeable
|
||||||
|
{{/micronaut_serde_jackson}}
|
||||||
{{#jackson}}
|
{{#jackson}}
|
||||||
@JsonPropertyOrder({
|
@JsonPropertyOrder({
|
||||||
{{#vars}}
|
{{#vars}}
|
||||||
@ -236,8 +239,8 @@ Declare the class with extends and implements
|
|||||||
{{^isReadOnly}}
|
{{^isReadOnly}}
|
||||||
{{#jackson}}
|
{{#jackson}}
|
||||||
{{^vendorExtensions.x-is-jackson-optional-nullable}}
|
{{^vendorExtensions.x-is-jackson-optional-nullable}}
|
||||||
{{>common/model/jackson_annotations}}{{/vendorExtensions.x-is-jackson-optional-nullable}}{{/jackson}}{{#vendorExtensions.x-setter-extra-annotation}} {{{vendorExtensions.x-setter-extra-annotation}}}
|
{{>common/model/jackson_annotations}}{{/vendorExtensions.x-is-jackson-optional-nullable}}{{#vendorExtensions.x-setter-extra-annotation}} {{{vendorExtensions.x-setter-extra-annotation}}}
|
||||||
{{/vendorExtensions.x-setter-extra-annotation}} public void {{setter}}({{{datatypeWithEnum}}} {{name}}) {
|
{{/vendorExtensions.x-setter-extra-annotation}}{{/jackson}} public void {{setter}}({{{datatypeWithEnum}}} {{name}}) {
|
||||||
{{#vendorExtensions.x-is-jackson-optional-nullable}}
|
{{#vendorExtensions.x-is-jackson-optional-nullable}}
|
||||||
this.{{name}} = JsonNullable.<{{{datatypeWithEnum}}}>of({{name}});
|
this.{{name}} = JsonNullable.<{{{datatypeWithEnum}}}>of({{name}});
|
||||||
{{/vendorExtensions.x-is-jackson-optional-nullable}}
|
{{/vendorExtensions.x-is-jackson-optional-nullable}}
|
||||||
|
@ -15,3 +15,20 @@
|
|||||||
{{/-last}}
|
{{/-last}}
|
||||||
{{/discriminator.mappedModels}}
|
{{/discriminator.mappedModels}}
|
||||||
{{/jackson}}
|
{{/jackson}}
|
||||||
|
{{#micronaut_serde_jackson}}
|
||||||
|
|
||||||
|
@JsonIgnoreProperties(
|
||||||
|
value = "{{{discriminator.propertyBaseName}}}", // ignore manually set {{{discriminator.propertyBaseName}}}, it will be automatically generated by Jackson during serialization
|
||||||
|
allowSetters = true // allows the {{{discriminator.propertyBaseName}}} to be set during deserialization
|
||||||
|
)
|
||||||
|
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "{{{discriminator.propertyBaseName}}}")
|
||||||
|
{{#discriminator.mappedModels}}
|
||||||
|
{{#-first}}
|
||||||
|
@JsonSubTypes({
|
||||||
|
{{/-first}}
|
||||||
|
@JsonSubTypes.Type(value = {{modelName}}.class, name = "{{^vendorExtensions.x-discriminator-value}}{{mappingName}}{{/vendorExtensions.x-discriminator-value}}{{#vendorExtensions.x-discriminator-value}}{{{vendorExtensions.x-discriminator-value}}}{{/vendorExtensions.x-discriminator-value}}"),
|
||||||
|
{{#-last}}
|
||||||
|
})
|
||||||
|
{{/-last}}
|
||||||
|
{{/discriminator.mappedModels}}
|
||||||
|
{{/micronaut_serde_jackson}}
|
||||||
|
@ -0,0 +1,53 @@
|
|||||||
|
package org.openapitools.codegen.java.micronaut;
|
||||||
|
|
||||||
|
import org.openapitools.codegen.CodegenConstants;
|
||||||
|
import org.openapitools.codegen.languages.JavaMicronautAbstractCodegen;
|
||||||
|
import org.openapitools.codegen.languages.JavaMicronautClientCodegen;
|
||||||
|
import org.testng.annotations.Test;
|
||||||
|
|
||||||
|
public class JavaMicronautClientCodegenSerializationLibraryTest extends AbstractMicronautCodegenTest {
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testSerializationLibraryJackson() {
|
||||||
|
JavaMicronautClientCodegen codegen = new JavaMicronautClientCodegen();
|
||||||
|
codegen.additionalProperties().put(CodegenConstants.SERIALIZATION_LIBRARY, JavaMicronautAbstractCodegen.SERIALIZATION_LIBRARY_TYPE.jackson.name());
|
||||||
|
String outputPath = generateFiles(codegen, PETSTORE_PATH,
|
||||||
|
CodegenConstants.MODELS);
|
||||||
|
|
||||||
|
// Model does not contain micronaut serde annotation
|
||||||
|
String micronautSerDeAnnotation = "@io.micronaut.serde.annotation.Serdeable";
|
||||||
|
String modelPath = outputPath + "src/main/java/org/openapitools/model/";
|
||||||
|
assertFileNotContains(modelPath + "Pet.java", micronautSerDeAnnotation);
|
||||||
|
assertFileNotContains(modelPath + "User.java", micronautSerDeAnnotation);
|
||||||
|
assertFileNotContains(modelPath + "Order.java", micronautSerDeAnnotation);
|
||||||
|
assertFileNotContains(modelPath + "Tag.java", micronautSerDeAnnotation);
|
||||||
|
assertFileNotContains(modelPath + "Category.java", micronautSerDeAnnotation);
|
||||||
|
|
||||||
|
//JsonFormat with jackson must be with shape attribute
|
||||||
|
assertFileContains(modelPath + "Order.java", "@JsonFormat(shape = JsonFormat.Shape.STRING");
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks micronaut-serde-jackson limitation.
|
||||||
|
* @see <a href="https://micronaut-projects.github.io/micronaut-serialization/latest/guide/index.html#jacksonAnnotations"></a>
|
||||||
|
*/
|
||||||
|
@Test
|
||||||
|
public void testSerializationLibraryMicronautSerdeJackson() {
|
||||||
|
JavaMicronautClientCodegen codegen = new JavaMicronautClientCodegen();
|
||||||
|
codegen.additionalProperties().put(CodegenConstants.SERIALIZATION_LIBRARY, JavaMicronautAbstractCodegen.SERIALIZATION_LIBRARY_TYPE.micronaut_serde_jackson.name());
|
||||||
|
String outputPath = generateFiles(codegen, PETSTORE_PATH,
|
||||||
|
CodegenConstants.MODELS);
|
||||||
|
|
||||||
|
// Model contains micronaut serde annotation
|
||||||
|
String micronautSerDeAnnotation = "@io.micronaut.serde.annotation.Serdeable";
|
||||||
|
String modelPath = outputPath + "src/main/java/org/openapitools/model/";
|
||||||
|
assertFileContains(modelPath + "Pet.java", micronautSerDeAnnotation);
|
||||||
|
assertFileContains(modelPath + "User.java", micronautSerDeAnnotation);
|
||||||
|
assertFileContains(modelPath + "Order.java", micronautSerDeAnnotation);
|
||||||
|
assertFileContains(modelPath + "Tag.java", micronautSerDeAnnotation);
|
||||||
|
assertFileContains(modelPath + "Category.java", micronautSerDeAnnotation);
|
||||||
|
|
||||||
|
//JsonFormat with micronaut-serde-jackson must be without shape attribute
|
||||||
|
assertFileNotContains(modelPath + "Order.java", "@JsonFormat(shape = JsonFormat.Shape.STRING");
|
||||||
|
}
|
||||||
|
}
|
@ -239,4 +239,16 @@ public class MicronautClientCodegenTest extends AbstractMicronautCodegenTest {
|
|||||||
String resourcesPath = outputPath + "src/main/resources/";
|
String resourcesPath = outputPath + "src/main/resources/";
|
||||||
assertFileContains(resourcesPath + "application.yml", "OAuth_2_0_Client_Credentials:");
|
assertFileContains(resourcesPath + "application.yml", "OAuth_2_0_Client_Credentials:");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testAdditionalClientTypeAnnotations() {
|
||||||
|
JavaMicronautClientCodegen codegen = new JavaMicronautClientCodegen();
|
||||||
|
codegen.additionalProperties().put(JavaMicronautClientCodegen.ADDITIONAL_CLIENT_TYPE_ANNOTATIONS, "MyAdditionalAnnotation1(1,${param1});MyAdditionalAnnotation2(2,${param2});");
|
||||||
|
String outputPath = generateFiles(codegen, PETSTORE_PATH,
|
||||||
|
CodegenConstants.APIS);
|
||||||
|
|
||||||
|
// Micronaut declarative http client should contain custom added annotations
|
||||||
|
assertFileContains(outputPath + "/src/main/java/org/openapitools/api/PetApi.java", "MyAdditionalAnnotation1(1,${param1})");
|
||||||
|
assertFileContains(outputPath + "/src/main/java/org/openapitools/api/PetApi.java", "MyAdditionalAnnotation2(2,${param2})");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user