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 2017/12/27 02:10:58 UTC

[incubator-servicecomb-java-chassis] 04/05: JAV-583 support consumer method name not equals to swagger operationId, use @ApiOperation(nickname="") to indicate operationName

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/incubator-servicecomb-java-chassis.git

commit a1f94875b8c85773602ca08b25a862d153c4aad5
Author: wujimin <wu...@huawei.com>
AuthorDate: Tue Dec 26 10:41:01 2017 +0800

    JAV-583 support consumer method name not equals to swagger operationId, use @ApiOperation(nickname="") to indicate operationName
---
 .../main/java/io/servicecomb/provider/pojo/Invoker.java  |  5 +++--
 .../servicecomb/swagger/engine/SwaggerEnvironment.java   | 16 +++++++++++++---
 .../swagger/engine/unittest/LocalProducerInvoker.java    | 13 +++++++++++--
 .../arguments/TestPojoConsumerEqualProducer.java         | 15 +++++++++++++++
 .../swagger/invocation/models/PojoConsumerIntf.java      |  5 +++++
 5 files changed, 47 insertions(+), 7 deletions(-)

diff --git a/providers/provider-pojo/src/main/java/io/servicecomb/provider/pojo/Invoker.java b/providers/provider-pojo/src/main/java/io/servicecomb/provider/pojo/Invoker.java
index 14527b8..4a46ba6 100644
--- a/providers/provider-pojo/src/main/java/io/servicecomb/provider/pojo/Invoker.java
+++ b/providers/provider-pojo/src/main/java/io/servicecomb/provider/pojo/Invoker.java
@@ -94,10 +94,11 @@ public class Invoker implements InvocationHandler {
       }
     }
 
+    SwaggerConsumerOperation consumerOperation = swaggerConsumer.findOperation(method.getName());
     Invocation invocation =
-        InvocationFactory.forConsumer(referenceConfig, schemaMeta, method.getName(), null);
+        InvocationFactory
+            .forConsumer(referenceConfig, schemaMeta, consumerOperation.getSwaggerMethod().getName(), null);
 
-    SwaggerConsumerOperation consumerOperation = swaggerConsumer.findOperation(method.getName());
     consumerOperation.getArgumentsMapper().toInvocation(args, invocation);
 
     if (CompletableFuture.class.equals(method.getReturnType())) {
diff --git a/swagger/swagger-invocation/invocation-core/src/main/java/io/servicecomb/swagger/engine/SwaggerEnvironment.java b/swagger/swagger-invocation/invocation-core/src/main/java/io/servicecomb/swagger/engine/SwaggerEnvironment.java
index b80dc53..4206363 100644
--- a/swagger/swagger-invocation/invocation-core/src/main/java/io/servicecomb/swagger/engine/SwaggerEnvironment.java
+++ b/swagger/swagger-invocation/invocation-core/src/main/java/io/servicecomb/swagger/engine/SwaggerEnvironment.java
@@ -22,6 +22,7 @@ import java.util.Map;
 
 import javax.inject.Inject;
 
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.stereotype.Component;
 
 import io.servicecomb.foundation.common.utils.BeanUtils;
@@ -88,9 +89,9 @@ public class SwaggerEnvironment {
     consumer.setConsumerIntf(consumerIntf);
     consumer.setSwaggerIntf(swaggerIntf);
     for (Method consumerMethod : consumerIntf.getMethods()) {
-      String methodName = consumerMethod.getName();
+      String swaggerMethodName = findSwaggerMethodName(consumerMethod);
       // consumer参数不一定等于swagger参数
-      Method swaggerMethod = ReflectUtils.findMethod(swaggerIntf, methodName);
+      Method swaggerMethod = ReflectUtils.findMethod(swaggerIntf, swaggerMethodName);
       if (swaggerMethod == null) {
         // consumer大于契约,非法
         String msg = String.format("consumer method %s:%s not exist in swagger.",
@@ -106,7 +107,7 @@ public class SwaggerEnvironment {
           consumerMethod.getGenericReturnType());
 
       SwaggerConsumerOperation op = new SwaggerConsumerOperation();
-      op.setName(methodName);
+      op.setName(consumerMethod.getName());
       op.setConsumerMethod(consumerMethod);
       op.setSwaggerMethod(swaggerMethod);
       op.setArgumentsMapper(argsMapper);
@@ -118,6 +119,15 @@ public class SwaggerEnvironment {
     return consumer;
   }
 
+  protected String findSwaggerMethodName(Method consumerMethod) {
+    ApiOperation apiOperationAnnotation = consumerMethod.getAnnotation(ApiOperation.class);
+    if (apiOperationAnnotation == null || StringUtils.isEmpty(apiOperationAnnotation.nickname())) {
+      return consumerMethod.getName();
+    }
+
+    return apiOperationAnnotation.nickname();
+  }
+
   public SwaggerProducer createProducer(Object producerInstance, Swagger swagger) {
     Class<?> producerCls = BeanUtils.getImplClassFromBean(producerInstance);
     Map<String, Method> visibleProducerMethods = retrieveVisibleMethods(producerCls);
diff --git a/swagger/swagger-invocation/invocation-core/src/main/java/io/servicecomb/swagger/engine/unittest/LocalProducerInvoker.java b/swagger/swagger-invocation/invocation-core/src/main/java/io/servicecomb/swagger/engine/unittest/LocalProducerInvoker.java
index c904902..ff3bcc3 100644
--- a/swagger/swagger-invocation/invocation-core/src/main/java/io/servicecomb/swagger/engine/unittest/LocalProducerInvoker.java
+++ b/swagger/swagger-invocation/invocation-core/src/main/java/io/servicecomb/swagger/engine/unittest/LocalProducerInvoker.java
@@ -19,6 +19,7 @@ package io.servicecomb.swagger.engine.unittest;
 import java.lang.reflect.InvocationHandler;
 import java.lang.reflect.Method;
 import java.lang.reflect.Proxy;
+import java.util.concurrent.CompletableFuture;
 
 import io.servicecomb.swagger.engine.SwaggerConsumer;
 import io.servicecomb.swagger.engine.SwaggerConsumerOperation;
@@ -73,10 +74,18 @@ public class LocalProducerInvoker implements InvocationHandler {
     invocation = new SwaggerInvocation();
 
     SwaggerConsumerOperation consumerOp = consumer.findOperation(method.getName());
-    SwaggerProducerOperation producerOp = producer.findOperation(method.getName());
+    SwaggerProducerOperation producerOp = producer.findOperation(consumerOp.getSwaggerMethod().getName());
 
     consumerOp.getArgumentsMapper().toInvocation(args, invocation);
     producerResponse = producerOp.doInvoke(invocation);
-    return consumerOp.getResponseMapper().mapResponse(producerResponse);
+    Object realResult = consumerOp.getResponseMapper().mapResponse(producerResponse);
+
+    if (CompletableFuture.class.equals(method.getReturnType())) {
+      CompletableFuture<Object> future = new CompletableFuture<>();
+      future.complete(realResult);
+      return future;
+    }
+
+    return realResult;
   }
 }
diff --git a/swagger/swagger-invocation/invocation-core/src/test/java/io/servicecomb/swagger/invocation/arguments/TestPojoConsumerEqualProducer.java b/swagger/swagger-invocation/invocation-core/src/test/java/io/servicecomb/swagger/invocation/arguments/TestPojoConsumerEqualProducer.java
index 8c1773b..1d0187f 100644
--- a/swagger/swagger-invocation/invocation-core/src/test/java/io/servicecomb/swagger/invocation/arguments/TestPojoConsumerEqualProducer.java
+++ b/swagger/swagger-invocation/invocation-core/src/test/java/io/servicecomb/swagger/invocation/arguments/TestPojoConsumerEqualProducer.java
@@ -19,6 +19,7 @@ package io.servicecomb.swagger.invocation.arguments;
 
 import java.util.Arrays;
 import java.util.List;
+import java.util.concurrent.CompletableFuture;
 
 import org.junit.Assert;
 import org.junit.BeforeClass;
@@ -82,6 +83,20 @@ public class TestPojoConsumerEqualProducer {
   }
 
   @Test
+  public void testObjectAsync() throws Exception {
+    Person person = new Person();
+    person.setName("abc");
+
+    CompletableFuture<Person> future = proxy.testObjectAsync(person);
+    Person result = future.get();
+
+    Person swaggerPerson = invoker.getSwaggerArgument(0);
+    Assert.assertEquals(person, swaggerPerson);
+
+    Assert.assertEquals("hello abc", result.getName());
+  }
+
+  @Test
   public void testSimpleAndObject() throws Exception {
     Person person = new Person();
     person.setName("abc");
diff --git a/swagger/swagger-invocation/invocation-core/src/test/java/io/servicecomb/swagger/invocation/models/PojoConsumerIntf.java b/swagger/swagger-invocation/invocation-core/src/test/java/io/servicecomb/swagger/invocation/models/PojoConsumerIntf.java
index 5abc03d..c3839c1 100644
--- a/swagger/swagger-invocation/invocation-core/src/test/java/io/servicecomb/swagger/invocation/models/PojoConsumerIntf.java
+++ b/swagger/swagger-invocation/invocation-core/src/test/java/io/servicecomb/swagger/invocation/models/PojoConsumerIntf.java
@@ -18,14 +18,19 @@
 package io.servicecomb.swagger.invocation.models;
 
 import java.util.List;
+import java.util.concurrent.CompletableFuture;
 
 import io.servicecomb.swagger.invocation.context.InvocationContext;
+import io.swagger.annotations.ApiOperation;
 
 public interface PojoConsumerIntf {
   int testSimple(int a, int b, int c);
 
   Person testObject(Person user);
 
+  @ApiOperation(nickname = "testObject", value = "")
+  CompletableFuture<Person> testObjectAsync(Person user);
+
   String testSimpleAndObject(String prefix, Person user);
 
   String testContext(InvocationContext context, String name);

-- 
To stop receiving notification emails like this one, please contact
"commits@servicecomb.apache.org" <co...@servicecomb.apache.org>.