Quantcast
Channel: Active questions tagged rest - Stack Overflow
Viewing all articles
Browse latest Browse all 3655

openapi-generator-cli-7.9.0 is adding useless import io.swagger.annotations.ApiModel; to generated .java classes

$
0
0

We have received a .yaml definition and I was tasked with defining an ant target (my company hates simpler tools like maven, I don't know why) to generate the corresponding client implementation that will be used to connect to a REST web service.I'm using the jaxrs-cxf-client generator.I have modified some .mustache templates I've found on the github repo in order to define how I'd like the classes and this way I've managed to successfully remove the unwanted swagger imports and annotations from all the classes under the api package. Sadly the swagger import has not been removed from all classes under the model package.

this is the ant part that I can show you:

[...]<java fork="true" jar="${jarsDir}/openapitools/openapi-generator-cli-7.9.0.jar"><sysproperty key="debug" value="true"/><!--Codegen--><arg value="generate"/><arg value="-g" /><arg value="jaxrs-cxf-client" /><arg value="--package-name"/><arg value="${package}"/><arg value="--api-package"/><arg value="${package}.api" /><arg value="--model-package"/><arg value="${package}.model" /><arg value="--output" /><arg value="${outputDir}" /><arg value="--input-spec" /><arg value="${yamlDir}/eAlarmRest-2024-10-07.yaml" /><arg value="--template-dir"/><arg value="${templates}"/><arg value="--verbose" /><!-- Add skip-validate-spec to bypass validation --><arg value="--skip-validate-spec"/><!-- Needed to avoid strange folders structures and unwanted test suite --><arg value="--global-property"/><arg value="modelTests=false"/><arg value="--global-property"/><arg value="modelDocs=false"/><arg value="--global-property"/><arg value="apiTests=false"/><arg value="--global-property"/><arg value="apiDocs=false"/><arg value="--additional-properties=sourceFolder=src/java,useSwaggerAnnotations=false,apiModelProperty=false,modelTests=false,modelDocs=false,apiTests=false,apiDocs=false"/></java><!-- Cleanup Step: Delete unwanted files --><echo message="Cleaning up unwanted files..."/><delete><fileset dir="${outputDir}"><include name="pom.xml"/><include name=".openapi-generator/**"/><include name=".openapi-generator-ignore"/></fileset></delete><echo message="Cleanup complete."/>

These are the templates that I'm using:

api.mustache:

package {{package}};{{#imports}}import {{import}};{{/imports}}import java.io.InputStream;import java.io.OutputStream;import java.util.List;import java.util.Map;import {{javaxPackage}}.ws.rs.*;import {{javaxPackage}}.ws.rs.core.Response;import {{javaxPackage}}.ws.rs.core.MediaType;{{#useBeanValidation}}import {{javaxPackage}}.validation.constraints.*;import {{javaxPackage}}.validation.Valid;{{/useBeanValidation}}{{#appName}}/** * {{{appName}}} * {{#appDescription}} * <p>{{{.}}} * {{/appDescription}} */{{/appName}}@Path("{{#useAnnotatedBasePath}}{{contextPath}}{{/useAnnotatedBasePath}}{{commonPath}}"){{#addConsumesProducesJson}}@Consumes(MediaType.APPLICATION_JSON)@Produces(MediaType.APPLICATION_JSON){{/addConsumesProducesJson}}public interface {{classname}}  {{{#operations}}{{#operation}}    {{#summary}}    /**     * {{summary}}     *     {{#notes}}     * {{.}}     *     {{/notes}}     */    {{/summary}}    @{{httpMethod}}    {{#subresourceOperation}}@Path("{{{path}}}"){{/subresourceOperation}}{{#hasConsumes}}    @Consumes({ {{#consumes}}"{{{mediaType}}}"{{^-last}}, {{/-last}}{{/consumes}} }){{/hasConsumes}}{{#hasProduces}}    @Produces({ {{#produces}}"{{{mediaType}}}"{{^-last}}, {{/-last}}{{/produces}} }){{/hasProduces}}    {{#implicitHeadersParams}}        {{#implicitHeadersParams}}        {{/implicitHeadersParams}}    })    {{/implicitHeadersParams}}    public {{>returnTypes}} {{nickname}}({{#allParams}}{{>queryParams}}{{>pathParams}}{{>headerParams}}{{>bodyParams}}{{>formParams}}{{^-last}}, {{/-last}}{{/allParams}});{{/operation}}}{{/operations}}

model.mustache:

package {{package}};{{#imports}}import {{import}};{{/imports}}{{#serializableModel}}// import java.io.Serializable;{{/serializableModel}}{{#useBeanValidation}}// import {{javaxPackage}}.validation.constraints.*;// import {{javaxPackage}}.validation.Valid;{{/useBeanValidation}}{{#models}}{{#model}}{{#isEnum}}{{>enumOuterClass}}{{/isEnum}}{{^isEnum}}{{>pojo}}{{/isEnum}}{{/model}}{{/models}}

pojo.mustache:

import java.util.Objects;{{#withXml}}import {{javaxPackage}}.xml.bind.annotation.XmlElement;import {{javaxPackage}}.xml.bind.annotation.XmlRootElement;import {{javaxPackage}}.xml.bind.annotation.XmlAccessType;import {{javaxPackage}}.xml.bind.annotation.XmlAccessorType;import {{javaxPackage}}.xml.bind.annotation.XmlType;import {{javaxPackage}}.xml.bind.annotation.XmlEnum;import {{javaxPackage}}.xml.bind.annotation.XmlEnumValue;{{/withXml}}import com.fasterxml.jackson.annotation.JsonProperty;{{#description}}/**  * {{{description}}} **/{{/description}}{{>additionalModelTypeAnnotations}}{{>xmlPojoAnnotation}}{{#discriminator}}{{>typeInfoAnnotation}}{{/discriminator}}{{#vendorExtensions.x-class-extra-annotation}}{{{vendorExtensions.x-class-extra-annotation}}}{{/vendorExtensions.x-class-extra-annotation}}public class {{classname}} {{#parent}}extends {{{.}}}{{/parent}}{{#vendorExtensions.x-implements}}{{#-first}} implements {{{.}}}{{/-first}}{{^-first}}, {{{.}}}{{/-first}}{{/vendorExtensions.x-implements}} {  {{#vars}}{{#isEnum}}{{^isContainer}}{{>enumClass}}{{/isContainer}}{{#isContainer}}{{#mostInnerItems}}{{>enumClass}}{{/mostInnerItems}}{{/isContainer}}{{/isEnum}}{{#withXml}}  @XmlElement(name="{{baseName}}"{{#required}}, required = {{required}}{{/required}}){{/withXml}}  {{^isPrimitiveType}}{{^isDate}}{{^isDateTime}}{{^isString}}{{^isFile}}{{#useBeanValidation}}  @Valid{{/useBeanValidation}}{{/isFile}}{{/isString}}{{/isDateTime}}{{/isDate}}{{/isPrimitiveType}}{{#description}} /**   * {{{.}}}  **/{{/description}}{{#vendorExtensions.x-field-extra-annotation}}{{{vendorExtensions.x-field-extra-annotation}}}{{/vendorExtensions.x-field-extra-annotation}}{{#vendorExtensions.x-is-jackson-optional-nullable}}  {{#isContainer}}  private JsonNullable<{{{datatypeWithEnum}}}> {{name}} = JsonNullable.<{{{datatypeWithEnum}}}>undefined();  {{/isContainer}}  {{^isContainer}}  private JsonNullable<{{{datatypeWithEnum}}}> {{name}} = JsonNullable.<{{{datatypeWithEnum}}}>{{#defaultValue}}of({{{.}}}){{/defaultValue}}{{^defaultValue}}undefined(){{/defaultValue}};  {{/isContainer}}{{/vendorExtensions.x-is-jackson-optional-nullable}}{{^vendorExtensions.x-is-jackson-optional-nullable}}  private {{{datatypeWithEnum}}} {{name}}{{#defaultValue}} = {{{.}}}{{/defaultValue}};{{/vendorExtensions.x-is-jackson-optional-nullable}}{{/vars}}  {{#vars}} /**  {{#description}}   * {{.}}  {{/description}}  {{^description}}   * Get {{name}}  {{/description}}  {{#minimum}}   * minimum: {{.}}  {{/minimum}}  {{#maximum}}   * maximum: {{.}}  {{/maximum}}   * @return {{name}}  **/{{#vendorExtensions.x-extra-annotation}}  {{{vendorExtensions.x-extra-annotation}}}{{/vendorExtensions.x-extra-annotation}}{{#vendorExtensions.x-is-jackson-optional-nullable}}{{!unannotated, Jackson would pick this up automatically and add it *in addition* to the _JsonNullable getter field}}  @JsonIgnore{{/vendorExtensions.x-is-jackson-optional-nullable}}{{^vendorExtensions.x-is-jackson-optional-nullable}}  @JsonProperty("{{baseName}}"){{/vendorExtensions.x-is-jackson-optional-nullable}}{{#useBeanValidation}}{{>beanValidation}}{{/useBeanValidation}}  {{#isEnum}}{{^isContainer}}public {{dataType}} {{getter}}() {  {{#vendorExtensions.x-is-jackson-optional-nullable}}    if ({{name}} == null || !{{name}}.isPresent() || {{name}}.get() == null) {      return null;    }    return {{name}}.get().value();  {{/vendorExtensions.x-is-jackson-optional-nullable}}  {{^vendorExtensions.x-is-jackson-optional-nullable}}    if ({{name}} == null) {      return null;    }    return {{name}}.value();  {{/vendorExtensions.x-is-jackson-optional-nullable}}  }{{/isContainer}}{{#isContainer}}public {{{datatypeWithEnum}}} {{getter}}() {  {{#vendorExtensions.x-is-jackson-optional-nullable}}    if ({{name}} == null) {      return null;    }    return {{name}}.orElse(null);  {{/vendorExtensions.x-is-jackson-optional-nullable}}  {{^vendorExtensions.x-is-jackson-optional-nullable}}    return {{name}};  {{/vendorExtensions.x-is-jackson-optional-nullable}}  }{{/isContainer}}{{/isEnum}}{{^isEnum}}public {{{datatypeWithEnum}}} {{getter}}() {  {{#vendorExtensions.x-is-jackson-optional-nullable}}    if ({{name}} == null) {      return null;    }    return {{name}}.orElse(null);  {{/vendorExtensions.x-is-jackson-optional-nullable}}  {{^vendorExtensions.x-is-jackson-optional-nullable}}    return {{name}};  {{/vendorExtensions.x-is-jackson-optional-nullable}}  }{{/isEnum}}  {{#vendorExtensions.x-is-jackson-optional-nullable}}  @JsonProperty("{{baseName}}")  public JsonNullable<{{{datatypeWithEnum}}}> {{getter}}_JsonNullable() {    return {{name}};  }  {{/vendorExtensions.x-is-jackson-optional-nullable}}  {{^isReadOnly}}  {{#vendorExtensions.x-setter-extra-annotation}}{{{vendorExtensions.x-setter-extra-annotation}}}  {{/vendorExtensions.x-setter-extra-annotation}}public void {{setter}}({{{datatypeWithEnum}}} {{name}}) {  {{#vendorExtensions.x-is-jackson-optional-nullable}}      this.{{name}} = JsonNullable.<{{{datatypeWithEnum}}}>of({{name}});  {{/vendorExtensions.x-is-jackson-optional-nullable}}  {{^vendorExtensions.x-is-jackson-optional-nullable}}    this.{{name}} = {{name}};  {{/vendorExtensions.x-is-jackson-optional-nullable}}  }  {{#vendorExtensions.x-is-jackson-optional-nullable}}  @JsonProperty("{{baseName}}")  public void {{setter}}_JsonNullable(JsonNullable<{{{datatypeWithEnum}}}> {{name}}) {    {{! For getters/setters that have name differing from attribute name, we must include setter (albeit private) for jackson to be able to set the attribute}}    this.{{name}} = {{name}};  }  {{/vendorExtensions.x-is-jackson-optional-nullable}}  public {{classname}} {{name}}({{{datatypeWithEnum}}} {{name}}) {  {{#vendorExtensions.x-is-jackson-optional-nullable}}    this.{{name}} = JsonNullable.<{{{datatypeWithEnum}}}>of({{name}});  {{/vendorExtensions.x-is-jackson-optional-nullable}}  {{^vendorExtensions.x-is-jackson-optional-nullable}}    this.{{name}} = {{name}};  {{/vendorExtensions.x-is-jackson-optional-nullable}}    return this;  }  {{#isArray}}  public {{classname}} add{{nameInPascalCase}}Item({{{items.datatypeWithEnum}}} {{name}}Item) {  {{#vendorExtensions.x-is-jackson-optional-nullable}}    if (this.{{name}} == null || !this.{{name}}.isPresent()) {      this.{{name}} = JsonNullable.<{{{datatypeWithEnum}}}>of({{{defaultValue}}}{{^defaultValue}}new {{#uniqueItems}}LinkedHashSet{{/uniqueItems}}{{^uniqueItems}}ArrayList{{/uniqueItems}}<>(){{/defaultValue}});    }    this.{{name}}.get().add({{name}}Item);    return this;  {{/vendorExtensions.x-is-jackson-optional-nullable}}  {{^vendorExtensions.x-is-jackson-optional-nullable}}    this.{{name}}.add({{name}}Item);    return this;  {{/vendorExtensions.x-is-jackson-optional-nullable}}  }  {{/isArray}}  {{#isMap}}  public {{classname}} put{{nameInPascalCase}}Item(String key, {{{items.datatypeWithEnum}}} {{name}}Item) {  {{#vendorExtensions.x-is-jackson-optional-nullable}}    if (this.{{name}} == null || !this.{{name}}.isPresent()) {      this.{{name}} = JsonNullable.<{{{datatypeWithEnum}}}>of({{{defaultValue}}}{{^defaultValue}}new HashMap<>(){{/defaultValue}});    }    this.{{name}}.get().put(key, {{name}}Item);    return this;  {{/vendorExtensions.x-is-jackson-optional-nullable}}  {{^vendorExtensions.x-is-jackson-optional-nullable}}    this.{{name}}.put(key, {{name}}Item);    return this;  {{/vendorExtensions.x-is-jackson-optional-nullable}}  }  {{/isMap}}  {{/isReadOnly}}  {{/vars}}  @Override  public boolean equals(Object o) {    if (this == o) {      return true;    }    if (o == null || getClass() != o.getClass()) {      return false;    }    {{classname}} {{classVarName}} = ({{classname}}) o;{{#hasVars}}    return {{#vars}}Objects.equals(this.{{name}}, {{classVarName}}.{{name}}){{^-last}} &&        {{/-last}}{{/vars}}{{#parent}} &&        super.equals(o){{/parent}};{{/hasVars}}{{^hasVars}}    return true;{{/hasVars}}  }  @Override  public int hashCode() {    return Objects.hash({{#vars}}{{name}}{{^-last}}, {{/-last}}{{/vars}}{{#parent}}{{#hasVars}}, {{/hasVars}}super.hashCode(){{/parent}});  }  @Override  public String toString() {    StringBuilder sb = new StringBuilder();    sb.append("class {{classname}} {\n");    {{#parent}}sb.append("    ").append(toIndentedString(super.toString())).append("\n");{{/parent}}    {{#vars}}sb.append("    {{name}}: ").append({{#isPassword}}"*"{{/isPassword}}{{^isPassword}}toIndentedString({{name}}){{/isPassword}}).append("\n");    {{/vars}}sb.append("}");    return sb.toString();  }  /**   * Convert the given object to string with each line indented by 4 spaces   * (except the first line).   */  private static String toIndentedString(Object o) {    if (o == null) {      return "null";    }    return o.toString().replace("\n", "\n    ");  }}

I've tried multiple to remove the imports and other stuff from the templates but nothing gave me the desired result. I've only found out that imports are related to the pojo template. I've only managed to generate empty classes instead of correct ones. This specification is likely to change again in the future so I'd like to avoid to manually remove the imports.

Sadly I cannot put here the actual code but I'll give an example of what I expect VS what I'm getting:

Class that I would expect:

package org.myorg.product;import org.myorg.product.model.OtherGeneratedClass;import java.util.ArrayList;import java.util.Arrays;import java.util.List;import java.util.Objects;import com.fasterxml.jackson.annotation.JsonProperty;/**  * Class Description **/public class AGeneratedClass {[...]}

What I'm getting after generation:

package org.myorg.product;import org.myorg.product.model.OtherGeneratedClass;import io.swagger.annotations.ApiModel;import java.util.ArrayList;import java.util.Arrays;import java.util.List;import java.util.Objects;import com.fasterxml.jackson.annotation.JsonProperty;/**  * Class Description **/public class AGeneratedClass {[...]}

Thanks a lot in advance!


Viewing all articles
Browse latest Browse all 3655

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>