openapi-generator icon indicating copy to clipboard operation
openapi-generator copied to clipboard

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

Open vmisra2018 opened this issue 5 years ago • 3 comments

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

vmisra2018 avatar Mar 30 '20 20:03 vmisra2018

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 avatar Apr 11 '24 21:04 Philzen

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 avatar Apr 11 '24 22:04 Philzen

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

Philzen avatar May 03 '24 21:05 Philzen