Skip to content

[BUG][Java] Enum values get JSON encoded in multipart/form-data requests #19973

Closed
@Tiim

Description

@Tiim

Bug Report Checklist

  • Have you provided a full/minimal spec to reproduce the issue?
  • Have you validated the input using an OpenAPI validator (example)?
  • Have you tested with the latest master to confirm the issue still exists?
  • Have you searched for related issues/PRs?
  • What's the actual output vs expected output?
  • [Optional] Sponsorship to speed up the bug fix or feature request (example)
Description

Enum values in multipart/form-data requests get wrapped in double quotes, instead of being included in the request as is.
This seems due to the following code in the generated ApiClient.java file: The enum gets JSON encoded, which results in the string "MY_ENUM" instead of the raw enum value MY_ENUM.

    /**
     * Add a Content-Disposition Header for the given key and complex object to the MultipartBody Builder.
     *
     * @param mpBuilder MultipartBody.Builder
     * @param key The key of the Header element
     * @param obj The complex object to add to the Header
     */
    private void addPartToMultiPartBuilder(MultipartBody.Builder mpBuilder, String key, Object obj) {
        RequestBody requestBody;
        if (obj instanceof String) {
            requestBody = RequestBody.create((String) obj, MediaType.parse("text/plain"));
        } else {
            String content;
            if (obj != null) {

// TODO: error is here. The object is an enum, which should NOT be JSON encoded!

                content = JSON.serialize(obj);
            } else {
                content = null;
            }
            requestBody = RequestBody.create(content, MediaType.parse("application/json"));
        }

        Headers partHeaders = Headers.of("Content-Disposition", "form-data; name=\"" + key + "\"");
        mpBuilder.addPart(partHeaders, requestBody);
    }

Example:

Generated POST request
POST /document HTTP/1.1
Accept: application/json
User-Agent: OpenAPI-Generator/2.16.0/java
Content-Type: multipart/form-data; boundary=79672ee3-fe3f-431d-802a-44a281963e66
Content-Length: 368
Host: localhost:3000
Connection: Keep-Alive
Accept-Encoding: gzip

--79672ee3-fe3f-431d-802a-44a281963e66
Content-Disposition: form-data; name="source_lang"
Content-Type: application/json; charset=utf-8
Content-Length: 4

"DE"
--79672ee3-fe3f-431d-802a-44a281963e66--
Expected POST request
POST /document HTTP/1.1
Accept: application/json
User-Agent: OpenAPI-Generator/2.16.0/java
Content-Type: multipart/form-data; boundary=79672ee3-fe3f-431d-802a-44a281963e66
Content-Length: 368
Host: localhost:3000
Connection: Keep-Alive
Accept-Encoding: gzip

--79672ee3-fe3f-431d-802a-44a281963e66
Content-Disposition: form-data; name="source_lang"
Content-Length: 2

DE
--79672ee3-fe3f-431d-802a-44a281963e66--
openapi-generator version

2.16.0

OpenAPI declaration file content or url

See Gist for a full example: https://gist.github.com/Tiim/65bdea69e5c381582fae6fd17dbdc80f

Generation Details
# codegen
mvn clean compile

# run debug server
npx http-echo-server
Steps to reproduce
  • Create a new empty folder
  • Copy the files from the Gist into the respective subfolders in this folder:
    • src/main/java/org/example/Main.java
    • src/main/openapi/openapi.yaml
    • pom.xml
  • Run mvn clean compile
  • Set a breakpoint in target/generated-sources/openapi/src/main/java/ch/example/ApiClient.java:1450
    • private void addPartToMultiPartBuilder(MultipartBody.Builder mpBuilder, String key, Object obj) {
  • Run src/main/java/org/example/Main.java in debug mode
Related issues/PRs
Suggest a fix
  • Check if the Object is a generated enum. In this case, use obj.getValue() (which gets generated by the codegen) instead of JSON.serialize().

Temporary workaround

While creating the minimal example for this bug report, I found that when the enum is declared inline in the request, not in the schemas section, it is not turned into a java enum.

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions