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 2018/11/25 11:41:04 UTC
[servicecomb-java-chassis] 01/02: [SCB-1031] resolve @ApiOperator
@Response override wrong,
if the previous Response's property has no-null value,
latest property will not overrite
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 <je...@163.com>
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() {
}