OpenAPITools / OpenAPITools/openapi-generator
Java Maven Feign x-www-form-urlencoded codegen broken
Nobody has claimed this yet.
- 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
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- 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