Skip to content

Commit 068ad02

Browse files
authored
[BUG] [JAVA] Fix multiple files upload (#4803) (#6808)
* gh-4803: Fix bug java client multiple files upload * gh-4803: Fix bug java client multiple files upload * gh-4803: Fix bug java client multiple files upload * gh-4803: Fix bug java client multiple files upload * gh-4803: Fix bug java client multiple files upload
1 parent f0157b8 commit 068ad02

File tree

21 files changed

+110
-5
lines changed

21 files changed

+110
-5
lines changed

modules/openapi-generator/src/main/resources/Java/libraries/resttemplate/api.mustache

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,8 @@ import java.util.Collections;
1010
import java.util.HashMap;
1111
import java.util.List;
1212
import java.util.Locale;
13-
import java.util.Map;{{/fullJavaUtil}}
13+
import java.util.Map;
14+
import java.util.stream.Collectors;{{/fullJavaUtil}}
1415

1516
import org.springframework.beans.factory.annotation.Autowired;
1617
import org.springframework.stereotype.Component;
@@ -130,7 +131,7 @@ public class {{classname}} {
130131
{{/hasMore}}{{/cookieParams}}{{/hasCookieParams}}{{#hasFormParams}}
131132

132133
{{#formParams}}if ({{paramName}} != null)
133-
formParams.{{^collectionFormat}}add{{/collectionFormat}}{{#collectionFormat}}put{{/collectionFormat}}("{{baseName}}", {{#isFile}}new FileSystemResource({{paramName}}){{/isFile}}{{^isFile}}{{paramName}}{{/isFile}});{{#hasMore}}
134+
formParams.{{^collectionFormat}}add{{/collectionFormat}}{{#collectionFormat}}put{{/collectionFormat}}("{{baseName}}", {{#isFile}}{{^collectionFormat}}new FileSystemResource({{paramName}}){{/collectionFormat}}{{/isFile}}{{#isFile}}{{#collectionFormat}}{{paramName}}.stream().map(FileSystemResource::new).collect(Collectors.toList()){{/collectionFormat}}{{/isFile}}{{^isFile}}{{paramName}}{{/isFile}});{{#hasMore}}
134135
{{/hasMore}}{{/formParams}}{{/hasFormParams}}
135136

136137
final String[] accepts = { {{#hasProduces}}

modules/openapi-generator/src/main/resources/Java/libraries/webclient/api.mustache

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import java.util.HashMap;
1010
import java.util.List;
1111
import java.util.Locale;
1212
import java.util.Map;
13+
import java.util.stream.Collectors;
1314
{{/fullJavaUtil}}
1415

1516
import org.springframework.beans.factory.annotation.Autowired;
@@ -108,7 +109,7 @@ public class {{classname}} {
108109

109110
{{#formParams}}
110111
if ({{paramName}} != null)
111-
formParams.add{{#collectionFormat}}All{{/collectionFormat}}("{{baseName}}", {{#isFile}}new FileSystemResource({{paramName}}){{/isFile}}{{^isFile}}{{paramName}}{{/isFile}});
112+
formParams.add{{#collectionFormat}}All{{/collectionFormat}}("{{baseName}}", {{#isFile}}{{^collectionFormat}}new FileSystemResource({{paramName}}){{/collectionFormat}}{{/isFile}}{{#isFile}}{{#collectionFormat}}{{paramName}}.stream().map(FileSystemResource::new).collect(Collectors.toList()){{/collectionFormat}}{{/isFile}}{{^isFile}}{{paramName}}{{/isFile}});
112113
{{/formParams}}
113114
{{/hasFormParams}}
114115

modules/openapi-generator/src/test/java/org/openapitools/codegen/java/JavaClientCodegenTest.java

Lines changed: 87 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,10 +26,8 @@
2626
import io.swagger.v3.oas.models.responses.ApiResponse;
2727
import io.swagger.v3.parser.util.SchemaTypeUtil;
2828
import org.openapitools.codegen.*;
29-
import org.openapitools.codegen.MockDefaultGenerator.WrittenTemplateBasedFile;
3029
import org.openapitools.codegen.config.CodegenConfigurator;
3130
import org.openapitools.codegen.languages.AbstractJavaCodegen;
32-
import org.openapitools.codegen.languages.DartClientCodegen;
3331
import org.openapitools.codegen.languages.JavaClientCodegen;
3432
import org.testng.Assert;
3533
import org.testng.annotations.Test;
@@ -842,4 +840,91 @@ public void testAnyType() {
842840
Assert.assertFalse(cp9.isFreeFormObject);
843841
Assert.assertFalse(cp9.isAnyType);
844842
}
843+
844+
/**
845+
* See https://github.com/OpenAPITools/openapi-generator/issues/4803
846+
*/
847+
@Test
848+
public void testRestTemplateFormMultipart() throws IOException {
849+
850+
Map<String, Object> properties = new HashMap<>();
851+
properties.put(JavaClientCodegen.JAVA8_MODE, true);
852+
properties.put(CodegenConstants.API_PACKAGE, "xyz.abcdef.api");
853+
854+
855+
File output = Files.createTempDirectory("test").toFile();
856+
output.deleteOnExit();
857+
858+
final CodegenConfigurator configurator = new CodegenConfigurator()
859+
.setGeneratorName("java")
860+
.setLibrary(JavaClientCodegen.RESTTEMPLATE)
861+
.setAdditionalProperties(properties)
862+
.setInputSpec("src/test/resources/3_0/form-multipart-binary-array.yaml")
863+
.setOutputDir(output.getAbsolutePath().replace("\\", "/"));
864+
865+
866+
DefaultGenerator generator = new DefaultGenerator();
867+
List<File> files = generator.opts(configurator.toClientOptInput()).generate();
868+
files.forEach(File::deleteOnExit);
869+
870+
871+
Path defaultApi = Paths.get(output + "/src/main/java/xyz/abcdef/api/MultipartApi.java");
872+
TestUtils.assertFileContains(defaultApi,
873+
//multiple files
874+
"multipartArrayWithHttpInfo(List<File> files)",
875+
"formParams.put(\"files\", files.stream().map(FileSystemResource::new).collect(Collectors.toList()));",
876+
877+
//mixed
878+
"multipartMixedWithHttpInfo(File file, MultipartMixedMarker marker)",
879+
"formParams.add(\"file\", new FileSystemResource(file));",
880+
881+
//single file
882+
"multipartSingleWithHttpInfo(File file)",
883+
"formParams.add(\"file\", new FileSystemResource(file));"
884+
);
885+
}
886+
887+
/**
888+
* See https://github.com/OpenAPITools/openapi-generator/issues/4803
889+
*/
890+
@Test
891+
public void testWebClientFormMultipart() throws IOException {
892+
893+
Map<String, Object> properties = new HashMap<>();
894+
properties.put(JavaClientCodegen.JAVA8_MODE, true);
895+
properties.put(CodegenConstants.API_PACKAGE, "xyz.abcdef.api");
896+
897+
898+
File output = Files.createTempDirectory("test").toFile();
899+
output.deleteOnExit();
900+
901+
final CodegenConfigurator configurator = new CodegenConfigurator()
902+
.setGeneratorName("java")
903+
.setLibrary(JavaClientCodegen.WEBCLIENT)
904+
.setAdditionalProperties(properties)
905+
.setInputSpec("src/test/resources/3_0/form-multipart-binary-array.yaml")
906+
.setOutputDir(output.getAbsolutePath().replace("\\", "/"));
907+
908+
909+
DefaultGenerator generator = new DefaultGenerator();
910+
List<File> files = generator.opts(configurator.toClientOptInput()).generate();
911+
files.forEach(File::deleteOnExit);
912+
913+
914+
Path defaultApi = Paths.get(output + "/src/main/java/xyz/abcdef/api/MultipartApi.java");
915+
TestUtils.assertFileContains(defaultApi,
916+
//multiple files
917+
"multipartArray(List<File> files)",
918+
"formParams.addAll(\"files\", files.stream().map(FileSystemResource::new).collect(Collectors.toList()));",
919+
920+
//mixed
921+
"multipartMixed(File file, MultipartMixedMarker marker)",
922+
"formParams.add(\"file\", new FileSystemResource(file));",
923+
924+
//single file
925+
"multipartSingle(File file)",
926+
"formParams.add(\"file\", new FileSystemResource(file));"
927+
);
928+
}
929+
845930
}

samples/client/petstore/java/resttemplate-withXml/src/main/java/org/openapitools/client/api/AnotherFakeApi.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import java.util.List;
1111
import java.util.Locale;
1212
import java.util.Map;
13+
import java.util.stream.Collectors;
1314

1415
import org.springframework.beans.factory.annotation.Autowired;
1516
import org.springframework.stereotype.Component;

samples/client/petstore/java/resttemplate-withXml/src/main/java/org/openapitools/client/api/FakeApi.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
import java.util.List;
1919
import java.util.Locale;
2020
import java.util.Map;
21+
import java.util.stream.Collectors;
2122

2223
import org.springframework.beans.factory.annotation.Autowired;
2324
import org.springframework.stereotype.Component;

samples/client/petstore/java/resttemplate-withXml/src/main/java/org/openapitools/client/api/FakeClassnameTags123Api.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import java.util.List;
1111
import java.util.Locale;
1212
import java.util.Map;
13+
import java.util.stream.Collectors;
1314

1415
import org.springframework.beans.factory.annotation.Autowired;
1516
import org.springframework.stereotype.Component;

samples/client/petstore/java/resttemplate-withXml/src/main/java/org/openapitools/client/api/PetApi.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
import java.util.List;
1414
import java.util.Locale;
1515
import java.util.Map;
16+
import java.util.stream.Collectors;
1617

1718
import org.springframework.beans.factory.annotation.Autowired;
1819
import org.springframework.stereotype.Component;

samples/client/petstore/java/resttemplate-withXml/src/main/java/org/openapitools/client/api/StoreApi.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import java.util.List;
1111
import java.util.Locale;
1212
import java.util.Map;
13+
import java.util.stream.Collectors;
1314

1415
import org.springframework.beans.factory.annotation.Autowired;
1516
import org.springframework.stereotype.Component;

samples/client/petstore/java/resttemplate-withXml/src/main/java/org/openapitools/client/api/UserApi.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import java.util.List;
1111
import java.util.Locale;
1212
import java.util.Map;
13+
import java.util.stream.Collectors;
1314

1415
import org.springframework.beans.factory.annotation.Autowired;
1516
import org.springframework.stereotype.Component;

samples/client/petstore/java/resttemplate/src/main/java/org/openapitools/client/api/AnotherFakeApi.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import java.util.List;
1111
import java.util.Locale;
1212
import java.util.Map;
13+
import java.util.stream.Collectors;
1314

1415
import org.springframework.beans.factory.annotation.Autowired;
1516
import org.springframework.stereotype.Component;

samples/client/petstore/java/resttemplate/src/main/java/org/openapitools/client/api/FakeApi.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
import java.util.List;
1919
import java.util.Locale;
2020
import java.util.Map;
21+
import java.util.stream.Collectors;
2122

2223
import org.springframework.beans.factory.annotation.Autowired;
2324
import org.springframework.stereotype.Component;

samples/client/petstore/java/resttemplate/src/main/java/org/openapitools/client/api/FakeClassnameTags123Api.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import java.util.List;
1111
import java.util.Locale;
1212
import java.util.Map;
13+
import java.util.stream.Collectors;
1314

1415
import org.springframework.beans.factory.annotation.Autowired;
1516
import org.springframework.stereotype.Component;

samples/client/petstore/java/resttemplate/src/main/java/org/openapitools/client/api/PetApi.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
import java.util.List;
1414
import java.util.Locale;
1515
import java.util.Map;
16+
import java.util.stream.Collectors;
1617

1718
import org.springframework.beans.factory.annotation.Autowired;
1819
import org.springframework.stereotype.Component;

samples/client/petstore/java/resttemplate/src/main/java/org/openapitools/client/api/StoreApi.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import java.util.List;
1111
import java.util.Locale;
1212
import java.util.Map;
13+
import java.util.stream.Collectors;
1314

1415
import org.springframework.beans.factory.annotation.Autowired;
1516
import org.springframework.stereotype.Component;

samples/client/petstore/java/resttemplate/src/main/java/org/openapitools/client/api/UserApi.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import java.util.List;
1111
import java.util.Locale;
1212
import java.util.Map;
13+
import java.util.stream.Collectors;
1314

1415
import org.springframework.beans.factory.annotation.Autowired;
1516
import org.springframework.stereotype.Component;

samples/client/petstore/java/webclient/src/main/java/org/openapitools/client/api/AnotherFakeApi.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import java.util.List;
99
import java.util.Locale;
1010
import java.util.Map;
11+
import java.util.stream.Collectors;
1112

1213
import org.springframework.beans.factory.annotation.Autowired;
1314
import org.springframework.util.LinkedMultiValueMap;

samples/client/petstore/java/webclient/src/main/java/org/openapitools/client/api/FakeApi.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
import java.util.List;
1717
import java.util.Locale;
1818
import java.util.Map;
19+
import java.util.stream.Collectors;
1920

2021
import org.springframework.beans.factory.annotation.Autowired;
2122
import org.springframework.util.LinkedMultiValueMap;

samples/client/petstore/java/webclient/src/main/java/org/openapitools/client/api/FakeClassnameTags123Api.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import java.util.List;
99
import java.util.Locale;
1010
import java.util.Map;
11+
import java.util.stream.Collectors;
1112

1213
import org.springframework.beans.factory.annotation.Autowired;
1314
import org.springframework.util.LinkedMultiValueMap;

samples/client/petstore/java/webclient/src/main/java/org/openapitools/client/api/PetApi.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
import java.util.List;
1212
import java.util.Locale;
1313
import java.util.Map;
14+
import java.util.stream.Collectors;
1415

1516
import org.springframework.beans.factory.annotation.Autowired;
1617
import org.springframework.util.LinkedMultiValueMap;

samples/client/petstore/java/webclient/src/main/java/org/openapitools/client/api/StoreApi.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import java.util.List;
99
import java.util.Locale;
1010
import java.util.Map;
11+
import java.util.stream.Collectors;
1112

1213
import org.springframework.beans.factory.annotation.Autowired;
1314
import org.springframework.util.LinkedMultiValueMap;

samples/client/petstore/java/webclient/src/main/java/org/openapitools/client/api/UserApi.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import java.util.List;
99
import java.util.Locale;
1010
import java.util.Map;
11+
import java.util.stream.Collectors;
1112

1213
import org.springframework.beans.factory.annotation.Autowired;
1314
import org.springframework.util.LinkedMultiValueMap;

0 commit comments

Comments
 (0)