Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[BUG]Openapi generator does not generate @XmlAttribute/@XmlElement annotations #5764

Closed
vmisra2018 opened this issue Mar 30, 2020 · 3 comments · Fixed by #18568
Closed

[BUG]Openapi generator does not generate @XmlAttribute/@XmlElement annotations #5764

vmisra2018 opened this issue Mar 30, 2020 · 3 comments · Fixed by #18568

Comments

@vmisra2018
Copy link

vmisra2018 commented Mar 30, 2020

Description

Trying to generate spring resttemplate client which comsumes applicaiton/xml but outputs json. I am expecting models to have @XmlAttribute/@xmlelement annotations but all it genrates is json. I have withXML as true in config of plugin.

openapi-generator version

4.3.1-SNAPSHOT
YAML

https://github.com/OpenAPITools/openapi-generator/blob/master/modules/openapi-generator-maven-plugin/examples/swagger.yaml

POM

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.2.6.RELEASE</version>
    <relativePath/> <!-- lookup parent from repository -->
  </parent>
  <groupId>com.example</groupId>
  <artifactId>hello</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <name>hello</name>
  <description>Demo project for Spring Boot</description>


  <build>
    <plugins>
      <!-- activate the plugin -->
      <plugin>
        <groupId>org.openapitools</groupId>
        <artifactId>openapi-generator-maven-plugin</artifactId>
        <!-- RELEASE_VERSION -->
        <version>4.3.1-SNAPSHOT</version>
        <!-- /RELEASE_VERSION -->
        <executions>
          <execution>
            <id>default</id>
            <goals>
              <goal>generate</goal>
            </goals>
            <configuration>
              <!-- specify the swagger yaml -->
              <inputSpec>${project.basedir}/swagger.yaml</inputSpec>

              <!-- target to generate java client code -->
              <generatorName>java</generatorName>

              <!-- hint: if you want to generate java server code, e.g. based on Spring Boot,
                   you can use the following target: <generatorName>spring</generatorName> -->

              <!-- pass any necessary config options -->
              <configOptions>
                <dateLibrary>joda</dateLibrary>
              </configOptions>

              <!-- override the default library to jersey2 -->
              <library>resttemplate</library>
            </configuration>
          </execution>
          <execution>
            <id>remote</id>
            <phase>generate-sources</phase>
            <goals>
              <goal>generate</goal>
            </goals>
            <configuration>
              <!-- specify the swagger yaml -->
              <inputSpec>https://raw.githubusercontent.com/OpenAPITools/openapi-generator/master/modules/openapi-generator/src/test/resources/2_0/petstore.yaml</inputSpec>

              <!-- target to generate java client code -->
              <generatorName>java</generatorName>

              <!-- hint: if you want to generate java server code, e.g. based on Spring Boot,
                   you can use the following target: <generatorName>spring</generatorName> -->

              <!-- pass any necessary config options -->
              <configOptions>
                <dateLibrary>joda</dateLibrary>
              </configOptions>

              <!-- override the default library to jersey2 -->
              <library>resttemplate</library>
              <withXml>true</withXml>

              <output>${project.build.directory}/generated-sources/remote-openapi</output>
              <apiPackage>remote.org.openapitools.client.api</apiPackage>
              <modelPackage>remote.org.openapitools.client.model</modelPackage>
              <invokerPackage>remote.org.openapitools.client</invokerPackage>
            </configuration>
          </execution>
        </executions>
      </plugin>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.8.1</version>
        <configuration>
          <source>1.7</source>
          <target>1.7</target>
          <proc>none</proc>
        </configuration>
      </plugin>
    </plugins>
  </build>
  <pluginRepositories>
    <pluginRepository>
      <id>sonatype-snapshots</id>
      <url>https://oss.sonatype.org/content/repositories/snapshots/</url>
    </pluginRepository>
  </pluginRepositories>
  <dependencies>
    <!-- dependencies are needed for the client being generated -->

    <dependency>
      <groupId>io.swagger</groupId>
      <artifactId>swagger-annotations</artifactId>
      <version>${swagger-annotations-version}</version>
    </dependency>

    <!-- You can find the dependencies for the library configuration you chose by looking in JavaClientCodegen.
         Then find the corresponding dependency on Maven Central, and set the versions in the property section below -->

    <!-- HTTP client: jersey-client -->
    <dependency>
      <groupId>org.glassfish.jersey.core</groupId>
      <artifactId>jersey-client</artifactId>
      <version>${jersey-version}</version>
    </dependency>

    <dependency>
      <artifactId>spring-boot-starter-web</artifactId>
      <groupId>org.springframework.boot</groupId>
    </dependency>


    <dependency>
      <groupId>org.glassfish.jersey.media</groupId>
      <artifactId>jersey-media-multipart</artifactId>
      <version>${jersey-version}</version>
    </dependency>
    <dependency>
      <groupId>org.glassfish.jersey.media</groupId>
      <artifactId>jersey-media-json-jackson</artifactId>
      <version>${jersey-version}</version>
      <exclusions>
        <exclusion>
          <artifactId>jackson-core</artifactId>
          <groupId>com.fasterxml.jackson.core</groupId>
        </exclusion>
        <exclusion>
          <artifactId>jackson-annotations</artifactId>
          <groupId>com.fasterxml.jackson.core</groupId>
        </exclusion>
      </exclusions>
    </dependency>

    <!-- @Nullable annotation -->
    <dependency>
      <groupId>com.google.code.findbugs</groupId>
      <artifactId>jsr305</artifactId>
      <version>3.0.2</version>
    </dependency>

    <dependency>
      <groupId>com.fasterxml.jackson.jaxrs</groupId>
      <artifactId>jackson-jaxrs-json-provider</artifactId>
      <version>${jackson-version}</version>
      <exclusions>
        <exclusion>
          <artifactId>jackson-core</artifactId>
          <groupId>com.fasterxml.jackson.core</groupId>
        </exclusion>
      </exclusions>
    </dependency>
    <dependency>
      <groupId>org.openapitools</groupId>
      <artifactId>jackson-databind-nullable</artifactId>
      <version>${jackson-databind-nullable-version}</version>
    </dependency>
  <dependency>
      <groupId>com.fasterxml.jackson.datatype</groupId>
      <artifactId>jackson-datatype-joda</artifactId>
      <version>${jackson-version}</version>
    <exclusions>
      <exclusion>
        <artifactId>joda-time</artifactId>
        <groupId>joda-time</groupId>
      </exclusion>
      <exclusion>
        <artifactId>jackson-core</artifactId>
        <groupId>com.fasterxml.jackson.core</groupId>
      </exclusion>
      <exclusion>
        <artifactId>jackson-annotations</artifactId>
        <groupId>com.fasterxml.jackson.core</groupId>
      </exclusion>
    </exclusions>
  </dependency>
    <dependency>
      <groupId>joda-time</groupId>
      <artifactId>joda-time</artifactId>
      <version>${jodatime-version}</version>
    </dependency>

    <!-- Base64 encoding that works in both JVM and Android -->
    <dependency>
      <groupId>com.brsanthu</groupId>
      <artifactId>migbase64</artifactId>
      <version>2.2</version>
    </dependency>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter</artifactId>
    </dependency>

    <dependency>
      <groupId>org.projectlombok</groupId>
      <artifactId>lombok</artifactId>
      <optional>true</optional>
    </dependency>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-test</artifactId>
      <scope>test</scope>
      <exclusions>
        <exclusion>
          <groupId>org.junit.vintage</groupId>
          <artifactId>junit-vintage-engine</artifactId>
        </exclusion>
      </exclusions>
    </dependency>
  </dependencies>

  <properties>
    <swagger-annotations-version>1.5.8</swagger-annotations-version>
    <jersey-version>2.27</jersey-version>
    <jackson-version>2.8.9</jackson-version>
    <jackson-databind-nullable-version>0.2.0</jackson-databind-nullable-version>
    <jodatime-version>2.7</jodatime-version>
    <maven-plugin-version>1.0.0</maven-plugin-version>
    <junit-version>4.8.1</junit-version>
    <java.version>11</java.version>
  </properties>
</project>

Steps to reproduce

mvn clean install

@Philzen
Copy link
Contributor

Philzen commented Apr 11, 2024

Also just bumped into this. Tried different generators (spring, java-native) to consume an XML-only API, but the generated models are lacking any @JacksonXml… properties, although the spec contains xml.attribute: true and xml.wrapped: false.

Without them the generated models are useless for deserialization – of course i can manually fix the missing annotation (which i tested fixes deserialization), but that negates the whole point of automatic model generation for constantly evolving open api's.

@bbdouglas & @diyfr can you confirm that this has not been implemented and maybe suggest what would need to be done to enable generation of these properties?

@Philzen
Copy link
Contributor

Philzen commented Apr 11, 2024

Turns out: withXml is a configOption (but for some reason is offered as a valid property for the plugin, although with a description that is obviously wrong).

@vmisra2018 – change your pom.xml accordingly:

              <!-- pass any necessary config options -->
              <configOptions>
                <dateLibrary>joda</dateLibrary>
                <withXml>true</withXml>
              </configOptions>

              <!-- override the default library to jersey2 -->
              <library>resttemplate</library>

and Jaxb and JacksonXml annotations will be generated. With the one exception of wrapped: false, which hopefully will get resolved via #2417

@Philzen
Copy link
Contributor

Philzen commented May 3, 2024

BTW, i believe this may be a duplicate of #3839

Philzen added a commit to Philzen/openapi-generator that referenced this issue May 3, 2024
Philzen added a commit to Philzen/openapi-generator that referenced this issue May 21, 2024
Philzen added a commit to Philzen/openapi-generator that referenced this issue May 21, 2024
Philzen added a commit to Philzen/openapi-generator that referenced this issue May 26, 2024
wing328 pushed a commit that referenced this issue May 27, 2024
…cs, maven & gradle plugin (#18568)

* Mention that Golang generator also supports XML annotations

Looking at src/main/resources/go/model_simple.mustache and
src/main/java/org/openapitools/codegen/languages/GoClientCodegen.java
the GoLang seems to cater for withXml=true

* Fix maven plugin config description for `withXml`

* Add basic test for global withXml setting

* Use global withXml setting if not configured in ConfigOptions

Resolves #3839 and #5764

* Don't generate metadata or other files when only Models are tested

* Reformat table for readability

* Remove global property `withXml` from generator and docs

* Move WITH_XML constant out of system constants block

Currently there is only a single reference to this value in the whole
codebase (GoClientOptionsProvider). Maybe we should re-think how this
file is organised (i.e. provide a clearer split / mapping / understanding
what are system properties vs. global properties vs. configOptions and
where to put them).

* Remove global option `withXml` from Maven plugin (Breaking change)

This is a "soft" breaking change: Plugin will no longer execute if
user have this option – which is good, b/c it never worked as expected.
We may want to hint this in the 8.0 release notes.

* Remove global property `withXml` from Gradle plugin (Breaking change)

This is a "soft" breaking change: Plugin will no longer execute if
user have this option – which is good, b/c it never worked as expected.
We may want to hint this in the 8.0 release notes, so they can add it
to the `configOptions` map if required, or simply delete it

* Update samples to reflect removed `withXml` property

* Move `withXml` option into ConfigOptions for Java Microprofile sample

* Remove unused local vars and parameters

* Avoid repetition using fluent assertions

* Remove extraneous debug output
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
2 participants