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() { }
