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 bb44089715eaecbe460f5f087d01902f40b129be
Author: weixing <[email protected]>
AuthorDate: Wed Nov 21 16:34:06 2018 +0800

    [SCB-1031] resolve @ApiOperator @Response override wrong, if the previous 
Response's property has no-null value, latest property will not overrite
---
 .../META-INF/spring/springmvc.provider.bean.xml    |  5 ++-
 .../core/processor/annotation/AnnotationUtils.java | 32 +++++++++++++++-
 .../generator/core/TestOperationGenerator.java     | 44 +++++++++++++++++++++-
 3 files changed, 76 insertions(+), 5 deletions(-)

diff --git 
a/samples/springmvc-sample/springmvc-provider/src/main/resources/META-INF/spring/springmvc.provider.bean.xml
 
b/samples/springmvc-sample/springmvc-provider/src/main/resources/META-INF/spring/springmvc.provider.bean.xml
index 568a45f..9982075 100644
--- 
a/samples/springmvc-sample/springmvc-provider/src/main/resources/META-INF/spring/springmvc.provider.bean.xml
+++ 
b/samples/springmvc-sample/springmvc-provider/src/main/resources/META-INF/spring/springmvc.provider.bean.xml
@@ -19,7 +19,10 @@
 <beans xmlns="http://www.springframework.org/schema/beans";
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
   xmlns:context="http://www.springframework.org/schema/context";
-  xsi:schemaLocation="http://www.springframework.org/schema/context 
http://www.springframework.org/schema/context/spring-context.xsd";>
+  xsi:schemaLocation="http://www.springframework.org/schema/beans
+                        
http://www.springframework.org/schema/beans/spring-beans.xsd
+                        http://www.springframework.org/schema/context
+                        
http://www.springframework.org/schema/context/spring-context.xsd";>
 
   <context:component-scan 
base-package="org.apache.servicecomb.samples.springmvc.provider"/>
 </beans>
diff --git 
a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/processor/annotation/AnnotationUtils.java
 
b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/processor/annotation/AnnotationUtils.java
index aebca2b..ddf8f45 100644
--- 
a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/processor/annotation/AnnotationUtils.java
+++ 
b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/processor/annotation/AnnotationUtils.java
@@ -115,7 +115,7 @@ public final class AnnotationUtils {
   public static void addResponse(Swagger swagger, Operation operation, 
ApiOperation apiOperation) {
     ResponseConfig responseConfig = convert(apiOperation);
     generateResponse(swagger, responseConfig);
-    operation.response(responseConfig.getCode(), responseConfig.getResponse());
+    mergeResponse(operation, responseConfig);
   }
 
   public static void addResponse(Swagger swagger, ApiResponse apiResponse) {
@@ -127,7 +127,35 @@ public final class AnnotationUtils {
   public static void addResponse(Swagger swagger, Operation operation, 
ApiResponse apiResponse) {
     ResponseConfig responseConfig = convert(apiResponse);
     generateResponse(swagger, responseConfig);
-    operation.response(responseConfig.getCode(), responseConfig.getResponse());
+    mergeResponse(operation, responseConfig);
+  }
+
+  private static void mergeResponse(Operation operation, ResponseConfig 
responseConfig) {
+    if (operation.getResponses() == null) {
+      operation.response(responseConfig.getCode(), 
responseConfig.getResponse());
+      return;
+    }
+    Response response = 
operation.getResponses().get(String.valueOf(responseConfig.getCode()));
+    if (response != null) {
+      Response targetResp = responseConfig.getResponse();
+      if (StringUtils.isNotEmpty(targetResp.getDescription()) && 
StringUtils.isEmpty(response.getDescription())) {
+        response.setDescription(targetResp.getDescription());
+      }
+      if (targetResp.getSchema() != null && response.getSchema() == null) {
+        response.setSchema(targetResp.getSchema());
+      }
+      if (targetResp.getExamples() != null && response.getExamples() == null) {
+        response.setExamples(targetResp.getExamples());
+      }
+      if (targetResp.getHeaders() != null && response.getHeaders() == null) {
+        response.setHeaders(targetResp.getHeaders());
+      }
+      if (targetResp.getVendorExtensions() != null && 
response.getVendorExtensions() == null) {
+        response.setVendorExtensions(targetResp.getVendorExtensions());
+      }
+    } else {
+      operation.response(responseConfig.getCode(), 
responseConfig.getResponse());
+    }
   }
 
   private static void generateResponse(Swagger swagger, ResponseConfig 
responseConfig) {
diff --git 
a/swagger/swagger-generator/generator-core/src/test/java/org/apache/servicecomb/swagger/generator/core/TestOperationGenerator.java
 
b/swagger/swagger-generator/generator-core/src/test/java/org/apache/servicecomb/swagger/generator/core/TestOperationGenerator.java
index 1b520bc..9fe126f 100644
--- 
a/swagger/swagger-generator/generator-core/src/test/java/org/apache/servicecomb/swagger/generator/core/TestOperationGenerator.java
+++ 
b/swagger/swagger-generator/generator-core/src/test/java/org/apache/servicecomb/swagger/generator/core/TestOperationGenerator.java
@@ -25,6 +25,8 @@ import java.lang.reflect.Method;
 import java.util.Collections;
 import java.util.List;
 
+import io.swagger.annotations.*;
+import io.swagger.models.Response;
 import org.apache.servicecomb.foundation.test.scaffolding.spring.SpringUtils;
 import org.apache.servicecomb.swagger.extend.parameter.HttpRequestParameter;
 import 
org.apache.servicecomb.swagger.generator.pojo.PojoSwaggerGeneratorContext;
@@ -32,7 +34,6 @@ import org.junit.Assert;
 import org.junit.Test;
 import org.springframework.util.StringValueResolver;
 
-import io.swagger.annotations.ApiOperation;
 import io.swagger.models.parameters.BodyParameter;
 import io.swagger.models.parameters.Parameter;
 import io.swagger.models.parameters.QueryParameter;
@@ -121,11 +122,50 @@ public class TestOperationGenerator {
     Assert.assertNotSame(parameter, 
operationGenerator.getProviderParameters().get(2));
   }
 
+  @Test
+  public void testApiOperationAndResponse() throws NoSuchMethodException {
+    Method function = TestClass.class.getMethod("function");
+    SwaggerGenerator swaggerGenerator = new SwaggerGenerator(new 
PojoSwaggerGeneratorContext(), TestClass.class);
+    OperationGenerator operationGenerator = new 
OperationGenerator(swaggerGenerator, function);
+    operationGenerator.generate();
+    Response response = 
operationGenerator.getOperation().getResponses().get("200");
+    Assert.assertEquals("200 is ok............", response.getDescription());
+    Assert.assertNotNull(response.getHeaders().get("x-user-domain"));
+    Assert.assertNull(response.getHeaders().get("x-user-name"));
+    
Assert.assertNotNull(operationGenerator.getOperation().getVendorExtensions().get("x-class-name"));
+
+    Method function1 = TestClass.class.getMethod("function1");
+    SwaggerGenerator swaggerGenerator1 = new SwaggerGenerator(new 
PojoSwaggerGeneratorContext(), TestClass.class);
+    OperationGenerator operationGenerator1 = new 
OperationGenerator(swaggerGenerator1, function1);
+    operationGenerator1.generate();
+    Response response1 = 
operationGenerator1.getOperation().getResponses().get("200");
+    Assert.assertEquals("200 is ok............", response1.getDescription());
+    Assert.assertNull(response1.getHeaders().get("x-user-domain"));
+    Assert.assertNotNull(response1.getHeaders().get("x-user-name"));
+    
Assert.assertNotNull(operationGenerator1.getOperation().getVendorExtensions().get("x-class-name"));
+  }
+
   private static class TestClass {
-    @ApiOperation(value = "value1", tags = {"tag1", "tag2"})
+
+    @ApiResponse(code = 200, message = "200 is ok............", response = 
String.class,
+            responseHeaders = @ResponseHeader(name = "x-user-domain", response 
= String.class))
+    @ApiOperation(value = "value1", tags = {"tag1", "tag2"},
+            responseHeaders = {@ResponseHeader(name = "x-user-name", response 
= String.class),
+                    @ResponseHeader(name = "x-user-id", response = 
String.class)},
+            extensions= {@Extension(name="x-class-name", properties= 
{@ExtensionProperty(value="value", name = "key")})})
     public void function() {
     }
 
+
+    @ApiOperation(value = "value1", tags = {"tag1", "tag2"},
+            responseHeaders = {@ResponseHeader(name = "x-user-name", response 
= String.class),
+                    @ResponseHeader(name = "x-user-id", response = 
String.class)},
+            extensions= {@Extension(name="x-class-name", properties= 
{@ExtensionProperty(value="value", name = "key")})})
+    @ApiResponse(code = 200, message = "200 is ok............", response = 
String.class,
+            responseHeaders = @ResponseHeader(name = "x-user-domain", response 
= String.class))
+    public void function1() {
+    }
+
     @ApiOperation(value = "value2")
     public void functionWithNoTag() {
     }

Reply via email to