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