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>.