OpenAPITools / OpenAPITools/openapi-generator

Java Maven Feign x-www-form-urlencoded codegen broken

Open
#4,908 4 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

Issue: Bug
Dominant language
Java
Stars
26.8k
Forks
7.7k
PR merge metrics
PR metrics pending

Description

Bug Report Checklist
  • Have you provided a full/minimal spec to reproduce the issue?
  • Have you validated the input using an OpenAPI validator (example)?
  • What's the version of OpenAPI Generator used?
  • Have you search for related issues/PRs?
  • What's the actual output vs expected output?
  • [Optional] Bounty to sponsor the fix (example)
Description

Maven Generator generates an invalid Feign interface when form encoding required..

openapi-generator version

from pom.xml

    <properties>
        <logback.version>1.2.3</logback.version>
        <slf4j.version>1.7.26</slf4j.version>

        <feign.version>10.2.3</feign.version>
        <feign.form.version>3.8.0</feign.form.version>
        <jackson.version>2.9.5</jackson.version>
        <okhttp3.version>3.11.0</okhttp3.version>
        <oltu-version>1.0.0</oltu-version>
        <okio.version>2.1.0</okio.version>

    </properties>

    <dependencies>

        <!-- Logging dependencies -->

        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>${slf4j.version}</version>
        </dependency>
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-classic</artifactId>
            <version>${logback.version}</version>
        </dependency>
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-core</artifactId>
            <version>${logback.version}</version>
        </dependency>

        <!-- Feign dependencies -->
        <dependency>
            <groupId>io.github.openfeign</groupId>
            <artifactId>feign-core</artifactId>
             <version>${feign.version}</version>
        </dependency>
        <dependency>
            <groupId>io.github.openfeign</groupId>
            <artifactId>feign-hystrix</artifactId>
             <version>${feign.version}</version>
        </dependency>
        <dependency>
            <groupId>io.github.openfeign</groupId>
            <artifactId>feign-slf4j</artifactId>
             <version>${feign.version}</version>
        </dependency>
        <dependency>
            <groupId>io.github.openfeign</groupId>
            <artifactId>feign-jackson</artifactId>
             <version>${feign.version}</version>
        </dependency>
        <dependency>
            <groupId>io.github.openfeign</groupId>
            <artifactId>feign-okhttp</artifactId>
             <version>${feign.version}</version>
        </dependency>
        <dependency>
            <groupId>io.github.openfeign.form</groupId>
            <artifactId>feign-form</artifactId>
             <version>${feign.form.version}</version>
        </dependency>

        <dependency>
            <groupId>com.squareup.okhttp3</groupId>
            <artifactId>okhttp</artifactId>
            <version>${okhttp3.version}</version>
        </dependency>
        <dependency>
            <groupId>com.squareup.okio</groupId>
            <artifactId>okio</artifactId>
            <version>${okio.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.oltu.oauth2</groupId>
            <artifactId>org.apache.oltu.oauth2.client</artifactId>
            <version>${oltu-version}</version>
        </dependency>

        <dependency>
            <groupId>javax.annotation</groupId>
            <artifactId>javax.annotation-api</artifactId>
            <version>1.2</version>
        </dependency>
        <dependency>
            <groupId>org.openapitools</groupId>
            <artifactId>jackson-databind-nullable</artifactId>
            <version>0.2.1</version>
        </dependency>

        <!-- Jackson dependencies -->

        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-core</artifactId>
            <version>${jackson.version}</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>${jackson.version}</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-annotations</artifactId>
            <version>${jackson.version}</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.datatype</groupId>
            <artifactId>jackson-datatype-jsr310</artifactId>
            <version>${jackson.version}</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.datatype</groupId>
            <artifactId>jackson-datatype-jdk8</artifactId>
            <version>${jackson.version}</version>
        </dependency>

        <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
           <version>2.6</version>
        </dependency>

        <dependency>
            <groupId>io.swagger</groupId>
            <artifactId>swagger-annotations</artifactId>
            <version>1.6.0</version>
        </dependency>

        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-api</artifactId>
            <version>5.5.2</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-engine</artifactId>
            <version>5.5.2</version>
            <scope>test</scope>
        </dependency>

    </dependencies>
<build>
<plugin>
    <groupId>org.openapitools</groupId>
    <artifactId>openapi-generator-maven-plugin</artifactId>
    <version>4.2.2</version>
    <executions>
        <execution>
            <id>oidc-api-contract</id>
            <goals>
                <goal>generate</goal>
            </goals>
            <configuration>
                <inputSpec>${project.build.directory}/contracts/oidc-api.yaml</inputSpec>
                <generatorName>java</generatorName>
                <configOptions>
                    <java8>true</java8>
                    <dateLibrary>java8</dateLibrary>
                    <library>feign</library>
                </configOptions>
                <templateDirectory>src/main/resources/Java</templateDirectory>
                <output>${project.build.directory}/generated-sources</output>
                <apiPackage>com.demo.oidc.api</apiPackage>
                <modelPackage>com.demo.oidc.model</modelPackage>
                <supportingFilesToGenerate>ApiClient.java,HttpBasicAuth.java,ApiKeyAuth.java,HttpBearerAuth.java,StringUtil.java,RFC3339DateFormat.java,EncodingUtils.java</supportingFilesToGenerate>
                <generateApis>true</generateApis>
                <generateApiTests>false</generateApiTests>
                <generateModelTests>false</generateModelTests>
                <invokerPackage>com.demo.oidc.api</invokerPackage>
                <httpUserAgent>oidc-generated-client</httpUserAgent>
                <library>feign</library>
                <additionalProperties>
                    <additionalProperty>jackson</additionalProperty>
                </additionalProperties>
            </configuration>
        </execution>
    </executions>
</plugin>
</build>
OpenAPI declaration file content or url
info:
  title: Keycloak Open ID Connect API
  version: '1.0'
  description: Open API Definition for Authentication
tags:
  - name: 'Open ID Connect'
paths:
  /auth/realms/demo/protocol/openid-connect/token:
    post:
      summary: Direct Access Grant
      description: 'https://tools.ietf.org/html/rfc6749#section-10.7'
      tags:
        - 'Open ID Connect'
      operationId: directAccessGrantCode
      requestBody:
        content:
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/AccessTokenRequest'
        required: true
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AccessTokenResponse'
        '401':
          description: Not authenticated
        '403':
          description: Access denied
components:
  schemas:
    AccessTokenRequest:
      type: object
      properties:
        client_id:
          type: string
        client_secret:
          type: string
        grant_type:
          type: string
        scope:
          type: string
        username:
          type: string
        password:
          type: string
      required:
        - client_id
        - client_secret
        - grant_type
        - scope
        - username
        - password
    AccessTokenResponse:
      type: object
      properties:
        access_token:
          type: string
        expires_in:
          type: integer
        refresh_expires_in:
          type: integer
        refresh_token:
          type: string
        token_type:
          type: string
        id_token:
          type: string
        not-before-policy:
          type: integer
          format: int64
        session_state:
          type: string
        scope:
          type: string
Command line used for generation
mvn clean generate-sources
Steps to reproduce

OpenIdConnectApi.java -

There is a code generator console log message about ignoring form parameters - interface is generated with no method parameters

    /**
    * Direct Access Grant
    * https://tools.ietf.org/html/rfc6749#section-10.7
            * @param clientId  (required)
            * @param clientSecret  (required)
            * @param grantType  (required)
            * @param scope  (required)
            * @param username  (required)
            * @param password  (required)
        * @return AccessTokenResponse
    */
    @RequestLine("POST /auth/realms/gumtree/protocol/openid-connect/token")
    @Headers({
    "Content-Type: application/x-www-form-urlencoded",
    "Accept: application/json"
    })
    Single<AccessTokenResponse> directAccessGrantCode();
Related issues/PRs

Seems related to..

https://github.com/OpenAPITools/openapi-generator/issues/50

Suggest a fix
     * Direct Access Grant
     * https://tools.ietf.org/html/rfc6749#section-10.7
     *
     * @param accessTokenRequest (required)
     * @return AccessTokenResponse
     */
    @RequestLine("POST /auth/realms/demo/protocol/openid-connect/token")
    @Headers({
            "Content-Type: application/x-www-form-urlencoded",
            "Accept: application/json"
    })
   AccessTokenResponse directAccessGrantCode(AccessTokenRequest accessTokenRequest);

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Start with the OpenAPI declaration and the generated OpenIdConnectApi.java produced by mvn clean generate-sources; compare the form-encoded request with the configured Java Feign library in pom.xml. Trace the generator's Feign entry point or template to determine why the required parameters are omitted. Done means the generated interface exposes the form request data and remains valid Feign code.

Written by the indexing model from the issue text.

Assessment

Tech stack
java
Domain
api, tooling
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Stale
Clarity
Mostly clear
Newbie friendliness
38/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.