You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@servicecomb.apache.org by li...@apache.org on 2019/01/16 10:00:16 UTC
[servicecomb-java-chassis] 03/04: [SCB-1046] file upload support
file array for the same name:fix with Types
This is an automated email from the ASF dual-hosted git repository.
liubao pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/servicecomb-java-chassis.git
commit 79c092fdfe0eb644c1b8776ef4459a02dffa3e89
Author: heyile <25...@qq.com>
AuthorDate: Mon Dec 10 11:44:38 2018 +0800
[SCB-1046] file upload support file array for the same name:fix with Types
---
.../it-common/src/main/resources/logback.xml | 1 +
.../apache/servicecomb/it/testcase/TestUpload.java | 63 ++++++++++++++++++++++
.../servicecomb/it/schema/UploadJaxrsSchema.java | 23 ++++++++
.../it/schema/UploadSpringmvcSchema.java | 14 +++++
swagger/swagger-generator/generator-core/pom.xml | 4 ++
.../swagger/generator/core/OperationGenerator.java | 20 ++++---
.../swagger-generator/generator-springmvc/pom.xml | 4 ++
.../parameter/MultipartFileListTypeProcessor.java | 4 +-
swagger/swagger-invocation/invocation-core/pom.xml | 4 ++
.../swagger/invocation/converter/ConverterMgr.java | 21 +++-----
.../invocation-springmvc/pom.xml | 4 ++
.../converter/SpringMultipartArrayConverter.java | 5 +-
.../converter/SpringMultipartListConverter.java | 6 +--
13 files changed, 141 insertions(+), 32 deletions(-)
diff --git a/integration-tests/it-common/src/main/resources/logback.xml b/integration-tests/it-common/src/main/resources/logback.xml
index d753514..4b59208 100644
--- a/integration-tests/it-common/src/main/resources/logback.xml
+++ b/integration-tests/it-common/src/main/resources/logback.xml
@@ -23,6 +23,7 @@
<pattern>%d [%level] [%thread] - %msg (%F:%L\)%n</pattern>
</encoder>
</appender>
+ <logger name="org.apache.servicecomb.common.javassist.JavassistUtils" level="WARN"/>
<root level="INFO">
<appender-ref ref="STDOUT"/>
</root>
diff --git a/integration-tests/it-consumer/src/main/java/org/apache/servicecomb/it/testcase/TestUpload.java b/integration-tests/it-consumer/src/main/java/org/apache/servicecomb/it/testcase/TestUpload.java
index a7d6792..d3fd5c1 100644
--- a/integration-tests/it-consumer/src/main/java/org/apache/servicecomb/it/testcase/TestUpload.java
+++ b/integration-tests/it-consumer/src/main/java/org/apache/servicecomb/it/testcase/TestUpload.java
@@ -108,6 +108,19 @@ public class TestUpload {
}
@Test
+ public void testJarxUploadArrayList1() {
+ Map<String, Object> map = new HashMap<>();
+ ArrayList<FileSystemResource> list = new ArrayList<>();
+ list.add(fileSystemResource1);
+ list.add(fileSystemResource2);
+ map.put("file1", list);
+ map.put("file2", fileSystemResource3);
+ String result = consumersJaxrs.getSCBRestTemplate()
+ .postForObject("/uploadArrayList1", new HttpEntity<>(map), String.class);
+ Assert.assertTrue(containsAll(result, "hello1", "中文 2", "cse3"));
+ }
+
+ @Test
public void testJarxUpload2() {
Map<String, Object> map = new HashMap<>();
map.put("file1", fileSystemResource1);
@@ -142,6 +155,19 @@ public class TestUpload {
}
@Test
+ public void testJarxUploadArrayList2() {
+ Map<String, Object> map = new HashMap<>();
+ ArrayList<FileSystemResource> list = new ArrayList<>();
+ list.add(fileSystemResource2);
+ list.add(fileSystemResource3);
+ map.put("file1", list);
+ map.put("message", message);
+ String result = consumersJaxrs.getSCBRestTemplate()
+ .postForObject("/uploadArrayList2", new HttpEntity<>(map), String.class);
+ Assert.assertTrue(containsAll(result, "cse3", "中文 2", message));
+ }
+
+ @Test
public void testJarxUploadMix() {
Map<String, Object> map = new HashMap<>();
List<FileSystemResource> list = new ArrayList<>();
@@ -204,6 +230,24 @@ public class TestUpload {
Assert.assertTrue(containsAll(result, "hello1", "cse4", "cse3", "中文 2", message));
}
+ @Test
+ public void testFileUploadArrayList() {
+ Map<String, Object> map = new HashMap<>();
+ ArrayList<FileSystemResource> list1 = new ArrayList<>();
+ ArrayList<FileSystemResource> list2 = new ArrayList<>();
+ list1.add(fileSystemResource1);
+ list1.add(fileSystemResource2);
+ list2.add(fileSystemResource3);
+ list2.add(fileSystemResource4);
+ map.put("file1", list1);
+ map.put("file2", list2);
+ map.put("name", message);
+ HttpHeaders headers = new HttpHeaders();
+ headers.setContentType(MediaType.MULTIPART_FORM_DATA);
+ String result = consumersSpringmvc.getSCBRestTemplate()
+ .postForObject("/uploadArrayList", new HttpEntity<>(map, headers), String.class);
+ Assert.assertTrue(containsAll(result, "hello1", "cse4", "cse3", "中文 2", message));
+ }
@Test
public void testFileUploadWithoutAnnotation() {
@@ -253,6 +297,25 @@ public class TestUpload {
}
@Test
+ public void testFileUploadArrayListWithoutAnnotation() {
+ Map<String, Object> map = new HashMap<>();
+ ArrayList<FileSystemResource> list1 = new ArrayList<>();
+ ArrayList<FileSystemResource> list2 = new ArrayList<>();
+ list1.add(fileSystemResource1);
+ list1.add(fileSystemResource2);
+ list2.add(fileSystemResource3);
+ list2.add(fileSystemResource4);
+ map.put("file1", list1);
+ map.put("file2", list2);
+ map.put("name", message);
+ HttpHeaders headers = new HttpHeaders();
+ headers.setContentType(MediaType.MULTIPART_FORM_DATA);
+ String result = consumersSpringmvc.getSCBRestTemplate()
+ .postForObject("/uploadArrayListArrayWithoutAnnotation", new HttpEntity<>(map, headers), String.class);
+ Assert.assertTrue(containsAll(result, "hello1", "cse4", "cse3", "中文 2", message));
+ }
+
+ @Test
public void testFileUploadMixWithoutAnnotation() {
Map<String, Object> map = new HashMap<>();
List<FileSystemResource> list1 = new ArrayList<>();
diff --git a/integration-tests/it-producer/src/main/java/org/apache/servicecomb/it/schema/UploadJaxrsSchema.java b/integration-tests/it-producer/src/main/java/org/apache/servicecomb/it/schema/UploadJaxrsSchema.java
index 3fe1268..6dccf71 100644
--- a/integration-tests/it-producer/src/main/java/org/apache/servicecomb/it/schema/UploadJaxrsSchema.java
+++ b/integration-tests/it-producer/src/main/java/org/apache/servicecomb/it/schema/UploadJaxrsSchema.java
@@ -18,6 +18,7 @@ package org.apache.servicecomb.it.schema;
import java.io.IOException;
import java.io.InputStream;
+import java.util.ArrayList;
import java.util.List;
import javax.servlet.http.Part;
@@ -64,6 +65,18 @@ public class UploadJaxrsSchema {
return stringBuilder.append(getStrFromPart(file2)).toString();
}
+ @Path("/uploadArrayList1")
+ @POST
+ @Produces(MediaType.TEXT_PLAIN)
+ public String uploadArrayList1(@FormParam("file1") ArrayList<Part> file1, @FormParam("file2") Part file2)
+ throws IOException {
+ StringBuilder stringBuilder = new StringBuilder();
+ file1.forEach(part -> {
+ stringBuilder.append(getStrFromPart(part));
+ });
+ return stringBuilder.append(getStrFromPart(file2)).toString();
+ }
+
@Path("/upload2")
@POST
@@ -96,6 +109,16 @@ public class UploadJaxrsSchema {
return stringBuilder.append(message).toString();
}
+ @Path("/uploadArrayList2")
+ @POST
+ @Produces(MediaType.TEXT_PLAIN)
+ public String uploadArrayList2(@FormParam("file1") ArrayList<Part> file1, @FormParam("message") String message) {
+ StringBuilder stringBuilder = new StringBuilder();
+ file1.forEach(part -> {
+ stringBuilder.append(getStrFromPart(part));
+ });
+ return stringBuilder.append(message).toString();
+ }
@Path("/uploadMix")
@POST
diff --git a/integration-tests/it-producer/src/main/java/org/apache/servicecomb/it/schema/UploadSpringmvcSchema.java b/integration-tests/it-producer/src/main/java/org/apache/servicecomb/it/schema/UploadSpringmvcSchema.java
index a884ea5..d77570c 100644
--- a/integration-tests/it-producer/src/main/java/org/apache/servicecomb/it/schema/UploadSpringmvcSchema.java
+++ b/integration-tests/it-producer/src/main/java/org/apache/servicecomb/it/schema/UploadSpringmvcSchema.java
@@ -60,6 +60,13 @@ public class UploadSpringmvcSchema {
return _fileUpload(file1) + name;
}
+ @RequestMapping(path = "/uploadArrayList", method = RequestMethod.POST, produces = MediaType.TEXT_PLAIN_VALUE, consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
+ public String fileUploadArrayList(@RequestPart(name = "file1") ArrayList<MultipartFile> file1,
+ @RequestPart(name = "file2") ArrayList<MultipartFile> file2, @RequestAttribute("name") String name) {
+ file1.addAll(file2);
+ return _fileUpload(file1) + name;
+ }
+
@RequestMapping(path = "/uploadWithoutAnnotation", method = RequestMethod.POST, produces = MediaType.TEXT_PLAIN_VALUE, consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
public String uploadWithoutAnnotation(MultipartFile file1, MultipartFile file2,
@RequestAttribute("name") String name) {
@@ -82,6 +89,13 @@ public class UploadSpringmvcSchema {
return _fileUpload(file1) + name;
}
+ @RequestMapping(path = "/uploadArrayListArrayWithoutAnnotation", method = RequestMethod.POST, produces = MediaType.TEXT_PLAIN_VALUE, consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
+ public String uploadArrayListWithoutAnnotation(ArrayList<MultipartFile> file1, ArrayList<MultipartFile> file2,
+ @RequestAttribute("name") String name) {
+ file1.addAll(file2);
+ return _fileUpload(file1) + name;
+ }
+
@RequestMapping(path = "/uploadMix", method = RequestMethod.POST, produces = MediaType.TEXT_PLAIN_VALUE, consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
public String uploadMix(@RequestPart(name = "file1") List<MultipartFile> file1,
@RequestPart(name = "file2") MultipartFile[] file2, @RequestAttribute("name") String name) {
diff --git a/swagger/swagger-generator/generator-core/pom.xml b/swagger/swagger-generator/generator-core/pom.xml
index fd22a22..924467b 100644
--- a/swagger/swagger-generator/generator-core/pom.xml
+++ b/swagger/swagger-generator/generator-core/pom.xml
@@ -66,6 +66,10 @@
<scope>test</scope>
</dependency>
<dependency>
+ <groupId>com.google.inject</groupId>
+ <artifactId>guice</artifactId>
+ </dependency>
+ <dependency>
<groupId>org.apache.servicecomb</groupId>
<artifactId>foundation-test-scaffolding</artifactId>
</dependency>
diff --git a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/OperationGenerator.java b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/OperationGenerator.java
index 90eb127..cd3b0f5 100644
--- a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/OperationGenerator.java
+++ b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/OperationGenerator.java
@@ -38,7 +38,7 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.util.StringUtils;
-import com.fasterxml.jackson.databind.type.TypeFactory;
+import com.google.inject.util.Types;
import io.swagger.models.HttpMethod;
import io.swagger.models.Operation;
@@ -347,16 +347,15 @@ public class OperationGenerator {
protected void processByParameterType(Type parameterType, int paramIdx) {
ParameterTypeProcessor processor = context.findParameterTypeProcessor(parameterType);
+ if (processor == null) {
+ //maybe is ArrayList ...
+ Type realType = checkAndGetType(parameterType);
+ if (realType != null) {
+ processor = context.findParameterTypeProcessor(realType);
+ }
+ }
if (processor != null) {
processor.process(this, paramIdx);
- return;
- }
- Type realType = checkAndGetType(parameterType);
- if (realType != null) {
- processor = context.findParameterTypeProcessor(realType);
- if (processor != null) {
- processor.process(this, paramIdx);
- }
}
}
@@ -366,8 +365,7 @@ public class OperationGenerator {
ParameterizedType targetType = (ParameterizedType) type;
Class<?> targetCls = (Class<?>) targetType.getRawType();
if (List.class.isAssignableFrom(targetCls)) {
- return TypeFactory.defaultInstance().constructCollectionType(List.class,
- (Class<?>) targetType.getActualTypeArguments()[0]);
+ return Types.newParameterizedType(List.class, (Class<?>) targetType.getActualTypeArguments()[0]);
}
}
return null;
diff --git a/swagger/swagger-generator/generator-springmvc/pom.xml b/swagger/swagger-generator/generator-springmvc/pom.xml
index 94b5939..5e8b4f6 100644
--- a/swagger/swagger-generator/generator-springmvc/pom.xml
+++ b/swagger/swagger-generator/generator-springmvc/pom.xml
@@ -46,6 +46,10 @@
<scope>test</scope>
</dependency>
<dependency>
+ <groupId>com.google.inject</groupId>
+ <artifactId>guice</artifactId>
+ </dependency>
+ <dependency>
<groupId>org.apache.servicecomb</groupId>
<artifactId>foundation-test-scaffolding</artifactId>
</dependency>
diff --git a/swagger/swagger-generator/generator-springmvc/src/main/java/org/apache/servicecomb/swagger/generator/springmvc/processor/parameter/MultipartFileListTypeProcessor.java b/swagger/swagger-generator/generator-springmvc/src/main/java/org/apache/servicecomb/swagger/generator/springmvc/processor/parameter/MultipartFileListTypeProcessor.java
index 3be6a40..289ecdd 100644
--- a/swagger/swagger-generator/generator-springmvc/src/main/java/org/apache/servicecomb/swagger/generator/springmvc/processor/parameter/MultipartFileListTypeProcessor.java
+++ b/swagger/swagger-generator/generator-springmvc/src/main/java/org/apache/servicecomb/swagger/generator/springmvc/processor/parameter/MultipartFileListTypeProcessor.java
@@ -25,7 +25,7 @@ import org.apache.servicecomb.swagger.generator.core.OperationGenerator;
import org.apache.servicecomb.swagger.generator.core.utils.ParamUtils;
import org.springframework.web.multipart.MultipartFile;
-import com.fasterxml.jackson.databind.type.TypeFactory;
+import com.google.inject.util.Types;
import io.swagger.models.parameters.FormParameter;
import io.swagger.models.properties.ArrayProperty;
@@ -36,7 +36,7 @@ public class MultipartFileListTypeProcessor implements CommonParameterTypeProces
@Override
public Type getParameterType() {
- return TypeFactory.defaultInstance().constructCollectionType(List.class, MultipartFile.class);
+ return Types.newParameterizedType(List.class, MultipartFile.class);
}
@Override
diff --git a/swagger/swagger-invocation/invocation-core/pom.xml b/swagger/swagger-invocation/invocation-core/pom.xml
index 3dd32e4..34b06c8 100644
--- a/swagger/swagger-invocation/invocation-core/pom.xml
+++ b/swagger/swagger-invocation/invocation-core/pom.xml
@@ -29,6 +29,10 @@
<dependencies>
<dependency>
+ <groupId>com.google.inject</groupId>
+ <artifactId>guice</artifactId>
+ </dependency>
+ <dependency>
<groupId>org.apache.servicecomb</groupId>
<artifactId>swagger-generator-core</artifactId>
</dependency>
diff --git a/swagger/swagger-invocation/invocation-core/src/main/java/org/apache/servicecomb/swagger/invocation/converter/ConverterMgr.java b/swagger/swagger-invocation/invocation-core/src/main/java/org/apache/servicecomb/swagger/invocation/converter/ConverterMgr.java
index c0d5e31..e86a55e 100644
--- a/swagger/swagger-invocation/invocation-core/src/main/java/org/apache/servicecomb/swagger/invocation/converter/ConverterMgr.java
+++ b/swagger/swagger-invocation/invocation-core/src/main/java/org/apache/servicecomb/swagger/invocation/converter/ConverterMgr.java
@@ -37,7 +37,7 @@ import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
-import com.fasterxml.jackson.databind.type.TypeFactory;
+import com.google.inject.util.Types;
@Component
public class ConverterMgr {
@@ -105,21 +105,15 @@ public class ConverterMgr {
protected Converter findSrcTarget(Type src, Type target) {
Map<Type, Converter> map = srcTargetMap.get(src);
if (map != null) {
- return map.get(target);
- }
- Type realSrc = checkAndGetType(src);
- if (realSrc != null) {
- Map<Type, Converter> typeConverterMap = srcTargetMap.get(realSrc);
- if (typeConverterMap != null) {
- Converter converter = typeConverterMap.get(target);
- if (converter != null) {
- return converter;
- }
+ Converter converter = map.get(target);
+ if (converter == null) {
+ //maybe target class is ArrayList...
Type realTarget = checkAndGetType(target);
if (realTarget != null) {
- return typeConverterMap.get(realTarget);
+ converter = map.get(realTarget);
}
}
+ return converter;
}
return null;
}
@@ -130,8 +124,7 @@ public class ConverterMgr {
ParameterizedType targetType = (ParameterizedType) type;
Class<?> targetCls = (Class<?>) targetType.getRawType();
if (List.class.isAssignableFrom(targetCls)) {
- return TypeFactory.defaultInstance().constructCollectionType(List.class,
- (Class<?>) targetType.getActualTypeArguments()[0]);
+ return Types.newParameterizedType(List.class, (Class<?>) targetType.getActualTypeArguments()[0]);
}
}
return null;
diff --git a/swagger/swagger-invocation/invocation-springmvc/pom.xml b/swagger/swagger-invocation/invocation-springmvc/pom.xml
index 6cd333d..bd9fc5b 100644
--- a/swagger/swagger-invocation/invocation-springmvc/pom.xml
+++ b/swagger/swagger-invocation/invocation-springmvc/pom.xml
@@ -33,6 +33,10 @@
<artifactId>swagger-invocation-core</artifactId>
</dependency>
<dependency>
+ <groupId>com.google.inject</groupId>
+ <artifactId>guice</artifactId>
+ </dependency>
+ <dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
</dependency>
diff --git a/swagger/swagger-invocation/invocation-springmvc/src/main/java/org/apache/servicecomb/swagger/invocation/converter/SpringMultipartArrayConverter.java b/swagger/swagger-invocation/invocation-springmvc/src/main/java/org/apache/servicecomb/swagger/invocation/converter/SpringMultipartArrayConverter.java
index e199005..cebbc29 100644
--- a/swagger/swagger-invocation/invocation-springmvc/src/main/java/org/apache/servicecomb/swagger/invocation/converter/SpringMultipartArrayConverter.java
+++ b/swagger/swagger-invocation/invocation-springmvc/src/main/java/org/apache/servicecomb/swagger/invocation/converter/SpringMultipartArrayConverter.java
@@ -24,14 +24,15 @@ import javax.servlet.http.Part;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;
-import com.fasterxml.jackson.databind.type.TypeFactory;
+import com.google.inject.util.Types;
+
@Component
public class SpringMultipartArrayConverter implements CustomizedConverter {
@Override
public Type getSrcType() {
- return TypeFactory.defaultInstance().constructCollectionType(List.class, Part.class);
+ return Types.newParameterizedType(List.class, Part.class);
}
@Override
diff --git a/swagger/swagger-invocation/invocation-springmvc/src/main/java/org/apache/servicecomb/swagger/invocation/converter/SpringMultipartListConverter.java b/swagger/swagger-invocation/invocation-springmvc/src/main/java/org/apache/servicecomb/swagger/invocation/converter/SpringMultipartListConverter.java
index cfd0cb0..7ed7ba9 100644
--- a/swagger/swagger-invocation/invocation-springmvc/src/main/java/org/apache/servicecomb/swagger/invocation/converter/SpringMultipartListConverter.java
+++ b/swagger/swagger-invocation/invocation-springmvc/src/main/java/org/apache/servicecomb/swagger/invocation/converter/SpringMultipartListConverter.java
@@ -25,19 +25,19 @@ import javax.servlet.http.Part;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;
-import com.fasterxml.jackson.databind.type.TypeFactory;
+import com.google.inject.util.Types;
@Component
public class SpringMultipartListConverter implements CustomizedConverter {
@Override
public Type getSrcType() {
- return TypeFactory.defaultInstance().constructCollectionType(List.class, Part.class);
+ return Types.newParameterizedType(List.class, Part.class);
}
@Override
public Type getTargetType() {
- return TypeFactory.defaultInstance().constructCollectionType(List.class, MultipartFile.class);
+ return Types.newParameterizedType(List.class, MultipartFile.class);
}
@Override