[ https://issues.apache.org/jira/browse/SCB-1031?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16698145#comment-16698145 ]
ASF GitHub Bot commented on SCB-1031: ------------------------------------- liubao68 closed pull request #999: [SCB-1031] resolve @ApiOperator @Response override wrong, if the prev… URL: https://github.com/apache/servicecomb-java-chassis/pull/999 This is a PR merged from a forked repository. As GitHub hides the original diff on merge, it is displayed below for the sake of provenance: As this is a foreign pull request (from a fork), the diff is supplied below (as it won't show otherwise due to GitHub magic): 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 568a45f33..998207518 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 aebca2b29..2193f8e29 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 static ResponseHeaderConfig convert(ResponseHeader responseHeader) { 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 static void addResponse(Swagger swagger, ApiResponse apiResponse) { 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) { + operation.response(responseConfig.getCode(), responseConfig.getResponse()); + return; + } + Response sourceResp = responseConfig.getResponse(); + if (StringUtils.isNotEmpty(sourceResp.getDescription()) && StringUtils.isEmpty(response.getDescription())) { + response.setDescription(sourceResp.getDescription()); + } + if (sourceResp.getSchema() != null && response.getSchema() == null) { + response.setSchema(sourceResp.getSchema()); + } + if (sourceResp.getExamples() != null && response.getExamples() == null) { + response.setExamples(sourceResp.getExamples()); + } + if (sourceResp.getHeaders() != null && response.getHeaders() == null) { + response.setHeaders(sourceResp.getHeaders()); + } + if (sourceResp.getVendorExtensions() != null && response.getVendorExtensions() == null) { + response.setVendorExtensions(sourceResp.getVendorExtensions()); + } } 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 1b520bc9d..9fe126fdd 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.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.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 void addProviderParameter() throws NoSuchMethodException { 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() { } ---------------------------------------------------------------- This is an automated message from the Apache Git Service. To respond to the message, please log on GitHub and use the URL above to go to the specific comment. For queries about this service, please contact Infrastructure at: us...@infra.apache.org > The Response's properties was overrided wrong between @APIOperation and > @Resoponse on the controller method > ----------------------------------------------------------------------------------------------------------- > > Key: SCB-1031 > URL: https://issues.apache.org/jira/browse/SCB-1031 > Project: Apache ServiceComb > Issue Type: Improvement > Components: Java-Chassis > Reporter: jeho0815 > Assignee: jeho0815 > Priority: Major > > @ApiResponse(code = 200, message = "200 is ok............", response = > String.class, responseHeaders = @ResponseHeader(name = "x-user-domain", > response = String.class)) > @ApiOperation(nickname="getHelloworld", value="test", notes="this is a > test", response = Integer.class, code = 200, > responseHeaders = > {@ResponseHeader(name = "x-user-name", response = String.class), > @ResponseHeader(name = "x-user-id", response = String.class)} > ) > > swagger 's response's descritpion will be default "resoponse of 200", the > best descritpion should be "200 is ok............" -- This message was sent by Atlassian JIRA (v7.6.3#76005)