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 2019/08/28 00:35:45 UTC

[servicecomb-java-chassis] branch master updated (0c9d5da -> 3da6ff5)

This is an automated email from the ASF dual-hosted git repository.

liubao pushed a change to branch master
in repository https://gitbox.apache.org/repos/asf/servicecomb-java-chassis.git.


    from 0c9d5da  [SCB-1457] delete no use code in ProtobufManager
     new d96a8ca  [SCB-1448]support class inheritance and interface inheritance with template type(add interface inheritance scenario support)
     new a4c085e  [SCB-1448]consistence methods for swagger generator and producer schema
     new 3da6ff5  delete redundant logic

The 3 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 .../definition/schema/ProducerSchemaFactory.java   |  2 +-
 .../it/schema/generic/TestMyService.java           | 22 +++++++
 ...MyService.java => MyEndpointWithInterface.java} |  7 +--
 .../servicecomb/it/schema/generic/MyService.java   |  2 +
 .../swagger/generator/core/SwaggerGenerator.java   | 38 ++----------
 .../swagger/generator/core/utils/MethodUtils.java  | 69 ++++++++++++++++++++++
 .../swagger/generator/core/utils/ParamUtils.java   | 17 +++++-
 .../core/{PersonBean.java => IMyServiceChild.java} |  2 +-
 .../{PersonBean.java => IMyServiceChild2.java}     |  2 +-
 .../swagger/generator/core/MyEndpoint2.java        | 18 ++----
 .../swagger/generator/core/TestParamUtils.java     | 20 +++++++
 .../generator/core/utils/AbstractBaseClass.java    | 14 ++---
 .../generator/core/{ => utils}/AbstractBean.java   | 12 ++--
 .../generator/core/utils/BaseInterface.java        |  9 ++-
 .../generator/core/utils/Hello2Endpoint.java       | 17 +++---
 .../swagger/generator/core/utils/HelloBean.java    | 14 ++---
 .../generator/core/utils/HelloEndpoint.java        | 11 ++--
 .../generator/core/utils/ServiceInterface.java     |  8 +--
 .../generator/core/utils/TestMethodUtils.java      | 28 ++++-----
 .../swagger/engine/SwaggerEnvironment.java         | 17 +++---
 .../swagger/engine/SwaggerProducerOperation.java   | 10 ++++
 .../engine/SwaggerEnvironmentForTest.java          |  2 +-
 22 files changed, 217 insertions(+), 124 deletions(-)
 copy integration-tests/it-producer/src/main/java/org/apache/servicecomb/it/schema/generic/{MyService.java => MyEndpointWithInterface.java} (88%)
 create mode 100644 swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/utils/MethodUtils.java
 copy swagger/swagger-generator/generator-core/src/test/java/org/apache/servicecomb/swagger/generator/core/{PersonBean.java => IMyServiceChild.java} (94%)
 copy swagger/swagger-generator/generator-core/src/test/java/org/apache/servicecomb/swagger/generator/core/{PersonBean.java => IMyServiceChild2.java} (91%)
 copy integration-tests/it-producer/src/main/java/org/apache/servicecomb/it/schema/generic/MyService.java => swagger/swagger-generator/generator-core/src/test/java/org/apache/servicecomb/swagger/generator/core/MyEndpoint2.java (80%)
 copy core/src/test/java/org/apache/servicecomb/core/provider/Person.java => swagger/swagger-generator/generator-core/src/test/java/org/apache/servicecomb/swagger/generator/core/utils/AbstractBaseClass.java (80%)
 copy swagger/swagger-generator/generator-core/src/test/java/org/apache/servicecomb/swagger/generator/core/{ => utils}/AbstractBean.java (81%)
 copy common/common-javassist/src/main/java/org/apache/servicecomb/common/javassist/MultiWrapper.java => swagger/swagger-generator/generator-core/src/test/java/org/apache/servicecomb/swagger/generator/core/utils/BaseInterface.java (83%)
 copy foundations/foundation-common/src/main/java/org/apache/servicecomb/foundation/common/encrypt/NoEncryption.java => swagger/swagger-generator/generator-core/src/test/java/org/apache/servicecomb/swagger/generator/core/utils/Hello2Endpoint.java (72%)
 copy demo/demo-jaxrs/jaxrs-client/src/main/java/org/apache/servicecomb/demo/jaxrs/client/pojoDefault/DefaultModel.java => swagger/swagger-generator/generator-core/src/test/java/org/apache/servicecomb/swagger/generator/core/utils/HelloBean.java (77%)
 copy foundations/foundation-vertx/src/main/java/org/apache/servicecomb/foundation/vertx/tcp/TcpConst.java => swagger/swagger-generator/generator-core/src/test/java/org/apache/servicecomb/swagger/generator/core/utils/HelloEndpoint.java (80%)
 copy common/common-javassist/src/main/java/org/apache/servicecomb/common/javassist/MultiWrapper.java => swagger/swagger-generator/generator-core/src/test/java/org/apache/servicecomb/swagger/generator/core/utils/ServiceInterface.java (82%)
 copy service-registry/src/test/java/org/apache/servicecomb/serviceregistry/version/TestVersionRuleFixedParser.java => swagger/swagger-generator/generator-core/src/test/java/org/apache/servicecomb/swagger/generator/core/utils/TestMethodUtils.java (61%)


[servicecomb-java-chassis] 02/03: [SCB-1448]consistence methods for swagger generator and producer schema

Posted by li...@apache.org.
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 a4c085ef8c24586436cf47447d8db4a3079d66db
Author: liubao <bi...@qq.com>
AuthorDate: Sun Aug 25 21:09:55 2019 +0800

    [SCB-1448]consistence methods for swagger generator and producer schema
---
 .../core/definition/schema/ProducerSchemaFactory.java |  2 +-
 .../servicecomb/it/schema/generic/TestMyService.java  |  4 ++++
 .../swagger/generator/core/MyEndpoint2.java           | 19 ++++++++++++++++---
 .../swagger/engine/SwaggerEnvironment.java            | 17 +++++++++--------
 .../servicecomb/engine/SwaggerEnvironmentForTest.java |  2 +-
 5 files changed, 31 insertions(+), 13 deletions(-)

diff --git a/core/src/main/java/org/apache/servicecomb/core/definition/schema/ProducerSchemaFactory.java b/core/src/main/java/org/apache/servicecomb/core/definition/schema/ProducerSchemaFactory.java
index 59888d4..ec67a27 100644
--- a/core/src/main/java/org/apache/servicecomb/core/definition/schema/ProducerSchemaFactory.java
+++ b/core/src/main/java/org/apache/servicecomb/core/definition/schema/ProducerSchemaFactory.java
@@ -76,7 +76,7 @@ public class ProducerSchemaFactory extends AbstractSchemaFactory<ProducerSchemaC
     SchemaMeta schemaMeta = getOrCreateSchema(context);
 
     SwaggerProducer producer = swaggerEnv.createProducer(producerInstance, schemaMeta.getSwaggerIntf(),
-        convertSwaggerOperationMap(schemaMeta));
+        convertSwaggerOperationMap(schemaMeta), compositeSwaggerGeneratorContext.selectContext(producerClass));
     Executor reactiveExecutor = BeanUtils.getBean(ExecutorManager.EXECUTOR_REACTIVE);
     for (OperationMeta operationMeta : schemaMeta.getOperations()) {
       SwaggerProducerOperation producerOperation = producer.findOperation(operationMeta.getOperationId());
diff --git a/integration-tests/it-consumer/src/main/java/org/apache/servicecomb/it/schema/generic/TestMyService.java b/integration-tests/it-consumer/src/main/java/org/apache/servicecomb/it/schema/generic/TestMyService.java
index 659e3a6..ac66fa8 100644
--- a/integration-tests/it-consumer/src/main/java/org/apache/servicecomb/it/schema/generic/TestMyService.java
+++ b/integration-tests/it-consumer/src/main/java/org/apache/servicecomb/it/schema/generic/TestMyService.java
@@ -60,6 +60,10 @@ public class TestMyService {
     resultBean = myserviceWithInterface.getIntf().actual();
     Assert.assertEquals("p", resultBean.getName());
 
+    PersonBean[] beanArray = new PersonBean[] {bean};
+    PersonBean[] beanArrayResult = myserviceWithInterface.getIntf().helloBody(beanArray);
+    Assert.assertEquals("p", beanArrayResult[0].getName());
+
     List<PersonBean> beanList = new ArrayList<>();
     beanList.add(bean);
     List<PersonBean> beanListResult = myserviceWithInterface.getIntf().helloList(beanList);
diff --git a/swagger/swagger-generator/generator-core/src/test/java/org/apache/servicecomb/swagger/generator/core/MyEndpoint2.java b/swagger/swagger-generator/generator-core/src/test/java/org/apache/servicecomb/swagger/generator/core/MyEndpoint2.java
index e5c2222..8ece9e8 100644
--- a/swagger/swagger-generator/generator-core/src/test/java/org/apache/servicecomb/swagger/generator/core/MyEndpoint2.java
+++ b/swagger/swagger-generator/generator-core/src/test/java/org/apache/servicecomb/swagger/generator/core/MyEndpoint2.java
@@ -1,10 +1,23 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
 package org.apache.servicecomb.swagger.generator.core;
 
 import java.util.List;
 
-/**
- * Created by Administrator on 2019/8/25.
- */
 public class MyEndpoint2 implements IMyService {
   @Override
   public PersonBean hello(PersonBean a) {
diff --git a/swagger/swagger-invocation/invocation-core/src/main/java/org/apache/servicecomb/swagger/engine/SwaggerEnvironment.java b/swagger/swagger-invocation/invocation-core/src/main/java/org/apache/servicecomb/swagger/engine/SwaggerEnvironment.java
index b3a2d55..42153b1 100644
--- a/swagger/swagger-invocation/invocation-core/src/main/java/org/apache/servicecomb/swagger/engine/SwaggerEnvironment.java
+++ b/swagger/swagger-invocation/invocation-core/src/main/java/org/apache/servicecomb/swagger/engine/SwaggerEnvironment.java
@@ -28,6 +28,8 @@ import org.apache.commons.lang3.StringUtils;
 import org.apache.servicecomb.foundation.common.utils.BeanUtils;
 import org.apache.servicecomb.foundation.common.utils.ReflectUtils;
 import org.apache.servicecomb.swagger.generator.core.CompositeSwaggerGeneratorContext;
+import org.apache.servicecomb.swagger.generator.core.SwaggerGeneratorContext;
+import org.apache.servicecomb.swagger.generator.core.utils.MethodUtils;
 import org.apache.servicecomb.swagger.generator.core.utils.ParamUtils;
 import org.apache.servicecomb.swagger.invocation.arguments.ArgumentsMapperConfig;
 import org.apache.servicecomb.swagger.invocation.arguments.consumer.ConsumerArgumentsMapper;
@@ -160,9 +162,9 @@ public class SwaggerEnvironment {
   }
 
   public SwaggerProducer createProducer(Object producerInstance, Class<?> swaggerIntf,
-      Map<String, Operation> swaggerOperationMap) {
+      Map<String, Operation> swaggerOperationMap, SwaggerGeneratorContext context) {
     Class<?> producerCls = BeanUtils.getImplClassFromBean(producerInstance);
-    Map<String, Method> visibleProducerMethods = retrieveVisibleMethods(producerCls);
+    Map<String, Method> visibleProducerMethods = retrieveVisibleMethods(producerCls, context);
 
     SwaggerProducer producer = new SwaggerProducer();
     producer.setProducerCls(producerCls);
@@ -221,16 +223,15 @@ public class SwaggerEnvironment {
     return argumentsMapperFactory;
   }
 
-  private Map<String, Method> retrieveVisibleMethods(Class<?> clazz) {
+  private Map<String, Method> retrieveVisibleMethods(Class<?> clazz, SwaggerGeneratorContext context) {
     Map<String, Method> visibleMethods = new HashMap<>();
-    for (Method method : clazz.getMethods()) {
+    for (Method method : MethodUtils.findProducerMethods(clazz)) {
+      if(!context.canProcess(method)) {
+        continue;
+      }
       String methodName = method.getName();
       ApiOperation apiOperationAnnotation = method.getAnnotation(ApiOperation.class);
       if (apiOperationAnnotation != null) {
-        if (apiOperationAnnotation.hidden()) {
-          continue;
-        }
-
         if (StringUtils.isNotEmpty(apiOperationAnnotation.nickname())) {
           methodName = apiOperationAnnotation.nickname();
         }
diff --git a/swagger/swagger-invocation/invocation-core/src/test/java/org/apache/servicecomb/engine/SwaggerEnvironmentForTest.java b/swagger/swagger-invocation/invocation-core/src/test/java/org/apache/servicecomb/engine/SwaggerEnvironmentForTest.java
index b2c6d00..8751ade 100644
--- a/swagger/swagger-invocation/invocation-core/src/test/java/org/apache/servicecomb/engine/SwaggerEnvironmentForTest.java
+++ b/swagger/swagger-invocation/invocation-core/src/test/java/org/apache/servicecomb/engine/SwaggerEnvironmentForTest.java
@@ -50,6 +50,6 @@ public class SwaggerEnvironmentForTest {
     SwaggerToClassGenerator swaggerToClassGenerator = new SwaggerToClassGenerator(classLoader, swagger,
         producerInstance.getClass().getPackage().getName());
     return swaggerEnvironment.createProducer(producerInstance, swaggerToClassGenerator.convert(),
-        new LinkedHashMap<>());
+        new LinkedHashMap<>(), producerGenerator.getContext());
   }
 }


[servicecomb-java-chassis] 01/03: [SCB-1448]support class inheritance and interface inheritance with template type(add interface inheritance scenario support)

Posted by li...@apache.org.
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 d96a8cafbed48ff22181a51433f7fd5dbcf35dbf
Author: liubao <bi...@qq.com>
AuthorDate: Sun Aug 25 18:51:46 2019 +0800

    [SCB-1448]support class inheritance and interface inheritance with template type(add interface inheritance scenario support)
---
 .../it/schema/generic/TestMyService.java           | 18 ++++++
 ...MyService.java => MyEndpointWithInterface.java} |  7 +--
 .../servicecomb/it/schema/generic/MyService.java   |  2 +
 .../swagger/generator/core/SwaggerGenerator.java   | 37 ++----------
 .../swagger/generator/core/utils/MethodUtils.java  | 69 ++++++++++++++++++++++
 .../swagger/generator/core/utils/ParamUtils.java   | 17 +++++-
 .../swagger/generator/core/IMyServiceChild.java    | 30 +---------
 .../swagger/generator/core/IMyServiceChild2.java   | 30 +---------
 .../swagger/generator/core/MyEndpoint2.java        | 28 +++++++++
 .../swagger/generator/core/TestParamUtils.java     | 20 +++++++
 .../generator/core/utils/AbstractBaseClass.java    | 31 ++--------
 .../swagger/generator/core/utils/AbstractBean.java | 31 +++-------
 .../generator/core/utils/BaseInterface.java        | 32 ++--------
 .../generator/core/utils/Hello2Endpoint.java       | 29 +++------
 .../swagger/generator/core/utils/HelloBean.java    | 31 +++-------
 .../generator/core/utils/HelloEndpoint.java        | 30 ++--------
 .../generator/core/utils/ServiceInterface.java     | 31 +---------
 .../generator/core/utils/TestMethodUtils.java      | 35 ++++-------
 .../swagger/engine/SwaggerProducerOperation.java   | 10 ++++
 19 files changed, 225 insertions(+), 293 deletions(-)

diff --git a/integration-tests/it-consumer/src/main/java/org/apache/servicecomb/it/schema/generic/TestMyService.java b/integration-tests/it-consumer/src/main/java/org/apache/servicecomb/it/schema/generic/TestMyService.java
index 1093772..659e3a6 100644
--- a/integration-tests/it-consumer/src/main/java/org/apache/servicecomb/it/schema/generic/TestMyService.java
+++ b/integration-tests/it-consumer/src/main/java/org/apache/servicecomb/it/schema/generic/TestMyService.java
@@ -27,6 +27,8 @@ import org.junit.Test;
 public class TestMyService {
   private static Consumers<IMyService> myservice = new Consumers<>("MyEndpoint",
       IMyService.class);
+  private static Consumers<IMyService> myserviceWithInterface = new Consumers<>("MyEndpointWithInterface",
+      IMyService.class);
 
   @Test
   public void testServiceInoke() {
@@ -47,4 +49,20 @@ public class TestMyService {
     List<PersonBean> beanListResult = myservice.getIntf().helloList(beanList);
     Assert.assertEquals("p", beanListResult.get(0).getName());
   }
+
+  @Test
+  public void testServiceWithInterfaceInoke() {
+    PersonBean bean = new PersonBean();
+    bean.setName("p");
+    PersonBean resultBean = myserviceWithInterface.getIntf().hello(bean);
+    Assert.assertEquals("p", resultBean.getName());
+
+    resultBean = myserviceWithInterface.getIntf().actual();
+    Assert.assertEquals("p", resultBean.getName());
+
+    List<PersonBean> beanList = new ArrayList<>();
+    beanList.add(bean);
+    List<PersonBean> beanListResult = myserviceWithInterface.getIntf().helloList(beanList);
+    Assert.assertEquals("p", beanListResult.get(0).getName());
+  }
 }
diff --git a/integration-tests/it-producer/src/main/java/org/apache/servicecomb/it/schema/generic/MyService.java b/integration-tests/it-producer/src/main/java/org/apache/servicecomb/it/schema/generic/MyEndpointWithInterface.java
similarity index 88%
copy from integration-tests/it-producer/src/main/java/org/apache/servicecomb/it/schema/generic/MyService.java
copy to integration-tests/it-producer/src/main/java/org/apache/servicecomb/it/schema/generic/MyEndpointWithInterface.java
index 51ef504..1b9a5e7 100644
--- a/integration-tests/it-producer/src/main/java/org/apache/servicecomb/it/schema/generic/MyService.java
+++ b/integration-tests/it-producer/src/main/java/org/apache/servicecomb/it/schema/generic/MyEndpointWithInterface.java
@@ -16,13 +16,12 @@
  */
 package org.apache.servicecomb.it.schema.generic;
 
-
 import java.util.List;
 
-import org.springframework.stereotype.Service;
+import org.apache.servicecomb.provider.pojo.RpcSchema;
 
-@Service
-public class MyService implements IMyService {
+@RpcSchema(schemaId = "MyEndpointWithInterface")
+public class MyEndpointWithInterface implements IMyService {
   @Override
   public PersonBean hello(PersonBean a) {
     return a;
diff --git a/integration-tests/it-producer/src/main/java/org/apache/servicecomb/it/schema/generic/MyService.java b/integration-tests/it-producer/src/main/java/org/apache/servicecomb/it/schema/generic/MyService.java
index 51ef504..bb97c6d 100644
--- a/integration-tests/it-producer/src/main/java/org/apache/servicecomb/it/schema/generic/MyService.java
+++ b/integration-tests/it-producer/src/main/java/org/apache/servicecomb/it/schema/generic/MyService.java
@@ -19,9 +19,11 @@ package org.apache.servicecomb.it.schema.generic;
 
 import java.util.List;
 
+import org.springframework.context.annotation.Primary;
 import org.springframework.stereotype.Service;
 
 @Service
+@Primary
 public class MyService implements IMyService {
   @Override
   public PersonBean hello(PersonBean a) {
diff --git a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/SwaggerGenerator.java b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/SwaggerGenerator.java
index c686f8a..f4346f7 100644
--- a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/SwaggerGenerator.java
+++ b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/SwaggerGenerator.java
@@ -33,6 +33,7 @@ import java.util.concurrent.CompletableFuture;
 import javax.ws.rs.core.MediaType;
 
 import org.apache.servicecomb.foundation.common.utils.JvmUtils;
+import org.apache.servicecomb.swagger.generator.core.utils.MethodUtils;
 import org.springframework.util.StringUtils;
 
 import io.swagger.annotations.Api;
@@ -210,12 +211,6 @@ public class SwaggerGenerator {
       return;
     }
 
-    //        Class<?>[] interfaces = cls.getInterfaces();
-    //        if (interfaces.length == 1) {
-    //            info.setVendorExtension(SwaggerConst.EXT_JAVA_INTF, interfaces[0].getName());
-    //            return;
-    //        }
-
     String intfName = ensureGetPackageName() + "." + cls.getSimpleName() + "Intf";
     info.setVendorExtension(SwaggerConst.EXT_JAVA_INTF, intfName);
   }
@@ -225,7 +220,7 @@ public class SwaggerGenerator {
    * This is used for the situation that the {@code interfaceCls} may be used as swagger interface directly
    */
   private boolean isInterfaceReactive(Class<?> interfaceCls) {
-    for (Method method : interfaceCls.getDeclaredMethods()) {
+    for (Method method : MethodUtils.findProducerMethods(interfaceCls)) {
       if (isSkipMethod(method)) {
         continue;
       }
@@ -236,35 +231,13 @@ public class SwaggerGenerator {
     return false;
   }
 
-  /**
-   * Whether this method should be processed as a swagger operation
-   * @return true if this isn't a swagger operation; otherwise, false.
-   */
-  protected boolean isSkipMethod(Method method) {
-    if (method.getDeclaringClass().getName().equals(Object.class.getName())) {
-      return true;
-    }
-    // skip static method
-    int modifiers = method.getModifiers();
-    if (Modifier.isStatic(modifiers)) {
-      return true;
-    }
-    // skip bridge method
-    if (method.isBridge()) {
-      return true;
-    }
-
-    ApiOperation apiOperation = method.getAnnotation(ApiOperation.class);
-    if (apiOperation != null && apiOperation.hidden()) {
-      return apiOperation.hidden();
-    }
-
-    return !context.canProcess(method);
+  protected boolean isSkipMethod(Method m) {
+    return !context.canProcess(m);
   }
 
   protected void scanMethods() {
     // 有时方法顺序不同,很不利于测试,所以先排序
-    List<Method> methods = Arrays.asList(cls.getMethods());
+    List<Method> methods = MethodUtils.findProducerMethods(cls);
     methods.sort(Comparator.comparing(Method::getName));
     for (Method method : methods) {
       if (isSkipMethod(method)) {
diff --git a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/utils/MethodUtils.java b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/utils/MethodUtils.java
new file mode 100644
index 0000000..196f508
--- /dev/null
+++ b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/utils/MethodUtils.java
@@ -0,0 +1,69 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.servicecomb.swagger.generator.core.utils;
+
+import java.lang.reflect.Method;
+import java.lang.reflect.Modifier;
+import java.util.ArrayList;
+import java.util.Comparator;
+import java.util.List;
+
+import io.swagger.annotations.ApiOperation;
+
+public class MethodUtils {
+  public static List<Method> findProducerMethods(Class<?> cls) {
+    Method[] methods = cls.getMethods();
+    List<Method> producerMethods = new ArrayList<>(methods.length);
+
+    for (Method m : methods) {
+      if (!isSkipMethod(cls, m)) {
+        producerMethods.add(m);
+      }
+    }
+
+    producerMethods.sort(Comparator.comparing(Method::getName));
+    return producerMethods;
+  }
+
+  public static boolean isSkipMethod(Class<?> cls, Method method) {
+    if (method.getDeclaringClass() == Object.class) {
+      return true;
+    }
+    if (method.getDeclaringClass().isInterface()
+        && !cls.isInterface()) {
+      // inherited template methods
+      return true;
+    }
+    // skip static method
+    int modifiers = method.getModifiers();
+    if (Modifier.isStatic(modifiers)) {
+      return true;
+    }
+    // skip bridge method
+    if (method.isBridge()) {
+      return true;
+    }
+
+    ApiOperation apiOperation = method.getAnnotation(ApiOperation.class);
+    if (apiOperation != null && apiOperation.hidden()) {
+      return apiOperation.hidden();
+    }
+
+    return false;
+  }
+}
diff --git a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/utils/ParamUtils.java b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/utils/ParamUtils.java
index 0d1160a..33fd75f 100644
--- a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/utils/ParamUtils.java
+++ b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/utils/ParamUtils.java
@@ -115,6 +115,12 @@ public final class ParamUtils {
           actualTypes = tempTypes;
         }
       }
+      if (typeVariables.length != actualTypes.length) {
+        throw new IllegalArgumentException(String
+            .format("not implement (%s) (%s) (%s), "
+                    + "e.g. extends multiple typed interface or too deep inheritance.",
+                mainClass.getName(), declaringClass.getName(), type.getTypeName()));
+      }
       for (int i = 0; i < typeVariables.length; i++) {
         if (typeVariables[i] == type) {
           return actualTypes[i];
@@ -134,17 +140,24 @@ public final class ParamUtils {
       return TypeUtils.parameterize((Class) parameterizedType.getRawType(), targetTypes);
     }
     throw new IllegalArgumentException(String
-        .format("not implement (%s) (%s) (%s)", mainClass.getName(), declaringClass.getName(), type.getTypeName()));
+        .format("not implement (%s) (%s) (%s)",
+            mainClass.getName(), declaringClass.getName(), type.getTypeName()));
   }
 
   private static Type[] getActualTypes(Type type) {
+    if (type instanceof Class<?>) {
+      if (((Class<?>) type).getSuperclass() != null) {
+        return getActualTypes(((Class<?>) type).getSuperclass());
+      } else {
+        return getActualTypes(((Class<?>) type).getGenericInterfaces()[0]);
+      }
+    }
     if (type instanceof ParameterizedType) {
       return ((ParameterizedType) type).getActualTypeArguments();
     }
     return new Type[0];
   }
 
-
   public static String generateBodyParameterName(Method method) {
     return method.getName() + "Body";
   }
diff --git a/integration-tests/it-producer/src/main/java/org/apache/servicecomb/it/schema/generic/MyService.java b/swagger/swagger-generator/generator-core/src/test/java/org/apache/servicecomb/swagger/generator/core/IMyServiceChild.java
similarity index 59%
copy from integration-tests/it-producer/src/main/java/org/apache/servicecomb/it/schema/generic/MyService.java
copy to swagger/swagger-generator/generator-core/src/test/java/org/apache/servicecomb/swagger/generator/core/IMyServiceChild.java
index 51ef504..07405e2 100644
--- a/integration-tests/it-producer/src/main/java/org/apache/servicecomb/it/schema/generic/MyService.java
+++ b/swagger/swagger-generator/generator-core/src/test/java/org/apache/servicecomb/swagger/generator/core/IMyServiceChild.java
@@ -14,34 +14,8 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.servicecomb.it.schema.generic;
 
+package org.apache.servicecomb.swagger.generator.core;
 
-import java.util.List;
-
-import org.springframework.stereotype.Service;
-
-@Service
-public class MyService implements IMyService {
-  @Override
-  public PersonBean hello(PersonBean a) {
-    return a;
-  }
-
-  @Override
-  public PersonBean[] helloBody(PersonBean[] a) {
-    return a;
-  }
-
-  @Override
-  public List<PersonBean> helloList(List<PersonBean> a) {
-    return a;
-  }
-
-  @Override
-  public PersonBean actual() {
-    PersonBean p = new PersonBean();
-    p.setName("p");
-    return p;
-  }
+public interface IMyServiceChild extends IMyService {
 }
diff --git a/integration-tests/it-producer/src/main/java/org/apache/servicecomb/it/schema/generic/MyService.java b/swagger/swagger-generator/generator-core/src/test/java/org/apache/servicecomb/swagger/generator/core/IMyServiceChild2.java
similarity index 59%
copy from integration-tests/it-producer/src/main/java/org/apache/servicecomb/it/schema/generic/MyService.java
copy to swagger/swagger-generator/generator-core/src/test/java/org/apache/servicecomb/swagger/generator/core/IMyServiceChild2.java
index 51ef504..0828846 100644
--- a/integration-tests/it-producer/src/main/java/org/apache/servicecomb/it/schema/generic/MyService.java
+++ b/swagger/swagger-generator/generator-core/src/test/java/org/apache/servicecomb/swagger/generator/core/IMyServiceChild2.java
@@ -14,34 +14,8 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.servicecomb.it.schema.generic;
 
+package org.apache.servicecomb.swagger.generator.core;
 
-import java.util.List;
-
-import org.springframework.stereotype.Service;
-
-@Service
-public class MyService implements IMyService {
-  @Override
-  public PersonBean hello(PersonBean a) {
-    return a;
-  }
-
-  @Override
-  public PersonBean[] helloBody(PersonBean[] a) {
-    return a;
-  }
-
-  @Override
-  public List<PersonBean> helloList(List<PersonBean> a) {
-    return a;
-  }
-
-  @Override
-  public PersonBean actual() {
-    PersonBean p = new PersonBean();
-    p.setName("p");
-    return p;
-  }
+public interface IMyServiceChild2 extends IMyService, IBaseService<PersonBean> {
 }
diff --git a/swagger/swagger-generator/generator-core/src/test/java/org/apache/servicecomb/swagger/generator/core/MyEndpoint2.java b/swagger/swagger-generator/generator-core/src/test/java/org/apache/servicecomb/swagger/generator/core/MyEndpoint2.java
new file mode 100644
index 0000000..e5c2222
--- /dev/null
+++ b/swagger/swagger-generator/generator-core/src/test/java/org/apache/servicecomb/swagger/generator/core/MyEndpoint2.java
@@ -0,0 +1,28 @@
+package org.apache.servicecomb.swagger.generator.core;
+
+import java.util.List;
+
+/**
+ * Created by Administrator on 2019/8/25.
+ */
+public class MyEndpoint2 implements IMyService {
+  @Override
+  public PersonBean hello(PersonBean a) {
+    return null;
+  }
+
+  @Override
+  public PersonBean[] helloBody(PersonBean[] a) {
+    return new PersonBean[0];
+  }
+
+  @Override
+  public List<PersonBean> helloList(List<PersonBean> a) {
+    return null;
+  }
+
+  @Override
+  public PersonBean actual() {
+    return null;
+  }
+}
diff --git a/swagger/swagger-generator/generator-core/src/test/java/org/apache/servicecomb/swagger/generator/core/TestParamUtils.java b/swagger/swagger-generator/generator-core/src/test/java/org/apache/servicecomb/swagger/generator/core/TestParamUtils.java
index 450d8a2..6539f6b 100644
--- a/swagger/swagger-generator/generator-core/src/test/java/org/apache/servicecomb/swagger/generator/core/TestParamUtils.java
+++ b/swagger/swagger-generator/generator-core/src/test/java/org/apache/servicecomb/swagger/generator/core/TestParamUtils.java
@@ -158,6 +158,20 @@ public class TestParamUtils {
     Method hello = IMyService.class.getMethod("hello", AbstractBean.class);
     assertEquals(PersonBean.class,
         ParamUtils.getGenericParameterType(IMyService.class, IBaseService.class, hello.getGenericReturnType()));
+    hello = IMyServiceChild.class.getMethod("hello", AbstractBean.class);
+    assertEquals(PersonBean.class,
+        ParamUtils.getGenericParameterType(IMyServiceChild.class, IBaseService.class, hello.getGenericReturnType()));
+
+    try {
+      hello = IMyServiceChild.class.getMethod("hello", AbstractBean.class);
+      assertEquals(PersonBean.class,
+          ParamUtils.getGenericParameterType(IMyServiceChild2.class, IBaseService.class, hello.getGenericReturnType()));
+      Assert.fail("");
+    } catch (IllegalArgumentException e) {
+      Assert.assertEquals("not implement (org.apache.servicecomb.swagger.generator.core.IMyServiceChild2) "
+          + "(org.apache.servicecomb.swagger.generator.core.IBaseService) (T), "
+          + "e.g. extends multiple typed interface or too deep inheritance.", e.getMessage());
+    }
 
     hello = MyEndpoint.class.getMethod("hello", AbstractBean.class);
     assertEquals(PersonBean.class,
@@ -171,6 +185,12 @@ public class TestParamUtils {
     assertEquals(PersonBean[].class, ParamUtils
         .getGenericParameterType(MyEndpoint.class, AbstractBaseService.class, helloBody.getGenericReturnType()));
 
+    helloBody = MyEndpoint2.class.getMethod("helloBody", PersonBean[].class);
+    assertEquals(PersonBean[].class, ParamUtils
+        .getGenericParameterType(MyEndpoint2.class, AbstractBaseService.class, helloBody.getGenericReturnType()));
+    assertEquals(PersonBean[].class, ParamUtils
+        .getGenericParameterType(MyEndpoint2.class, AbstractBaseService.class, helloBody.getGenericParameterTypes()[0]));
+
     Method helloList = IMyService.class.getMethod("helloList", List.class);
     assertEquals(TypeUtils.parameterize(List.class, PersonBean.class),
         ParamUtils.getGenericParameterType(IMyService.class, IBaseService.class, helloList.getGenericReturnType()));
diff --git a/integration-tests/it-producer/src/main/java/org/apache/servicecomb/it/schema/generic/MyService.java b/swagger/swagger-generator/generator-core/src/test/java/org/apache/servicecomb/swagger/generator/core/utils/AbstractBaseClass.java
similarity index 60%
copy from integration-tests/it-producer/src/main/java/org/apache/servicecomb/it/schema/generic/MyService.java
copy to swagger/swagger-generator/generator-core/src/test/java/org/apache/servicecomb/swagger/generator/core/utils/AbstractBaseClass.java
index 51ef504..50c577d 100644
--- a/integration-tests/it-producer/src/main/java/org/apache/servicecomb/it/schema/generic/MyService.java
+++ b/swagger/swagger-generator/generator-core/src/test/java/org/apache/servicecomb/swagger/generator/core/utils/AbstractBaseClass.java
@@ -14,34 +14,13 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.servicecomb.it.schema.generic;
 
+package org.apache.servicecomb.swagger.generator.core.utils;
 
-import java.util.List;
+public abstract class AbstractBaseClass<T extends AbstractBean> {
+  abstract T get(T param);
 
-import org.springframework.stereotype.Service;
-
-@Service
-public class MyService implements IMyService {
-  @Override
-  public PersonBean hello(PersonBean a) {
-    return a;
-  }
-
-  @Override
-  public PersonBean[] helloBody(PersonBean[] a) {
-    return a;
-  }
-
-  @Override
-  public List<PersonBean> helloList(List<PersonBean> a) {
-    return a;
-  }
-
-  @Override
-  public PersonBean actual() {
-    PersonBean p = new PersonBean();
-    p.setName("p");
-    return p;
+  public T getBase(T param) {
+    return param;
   }
 }
diff --git a/integration-tests/it-producer/src/main/java/org/apache/servicecomb/it/schema/generic/MyService.java b/swagger/swagger-generator/generator-core/src/test/java/org/apache/servicecomb/swagger/generator/core/utils/AbstractBean.java
similarity index 60%
copy from integration-tests/it-producer/src/main/java/org/apache/servicecomb/it/schema/generic/MyService.java
copy to swagger/swagger-generator/generator-core/src/test/java/org/apache/servicecomb/swagger/generator/core/utils/AbstractBean.java
index 51ef504..85515b5 100644
--- a/integration-tests/it-producer/src/main/java/org/apache/servicecomb/it/schema/generic/MyService.java
+++ b/swagger/swagger-generator/generator-core/src/test/java/org/apache/servicecomb/swagger/generator/core/utils/AbstractBean.java
@@ -14,34 +14,17 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.servicecomb.it.schema.generic;
 
+package org.apache.servicecomb.swagger.generator.core.utils;
 
-import java.util.List;
+public abstract class AbstractBean {
+  private String type;
 
-import org.springframework.stereotype.Service;
-
-@Service
-public class MyService implements IMyService {
-  @Override
-  public PersonBean hello(PersonBean a) {
-    return a;
-  }
-
-  @Override
-  public PersonBean[] helloBody(PersonBean[] a) {
-    return a;
-  }
-
-  @Override
-  public List<PersonBean> helloList(List<PersonBean> a) {
-    return a;
+  public String getType() {
+    return type;
   }
 
-  @Override
-  public PersonBean actual() {
-    PersonBean p = new PersonBean();
-    p.setName("p");
-    return p;
+  public void setType(String type) {
+    this.type = type;
   }
 }
diff --git a/integration-tests/it-producer/src/main/java/org/apache/servicecomb/it/schema/generic/MyService.java b/swagger/swagger-generator/generator-core/src/test/java/org/apache/servicecomb/swagger/generator/core/utils/BaseInterface.java
similarity index 59%
copy from integration-tests/it-producer/src/main/java/org/apache/servicecomb/it/schema/generic/MyService.java
copy to swagger/swagger-generator/generator-core/src/test/java/org/apache/servicecomb/swagger/generator/core/utils/BaseInterface.java
index 51ef504..1cef6c4 100644
--- a/integration-tests/it-producer/src/main/java/org/apache/servicecomb/it/schema/generic/MyService.java
+++ b/swagger/swagger-generator/generator-core/src/test/java/org/apache/servicecomb/swagger/generator/core/utils/BaseInterface.java
@@ -14,34 +14,10 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.servicecomb.it.schema.generic;
+package org.apache.servicecomb.swagger.generator.core.utils;
 
+public interface BaseInterface<T extends AbstractBean> {
+  T get(T param);
 
-import java.util.List;
-
-import org.springframework.stereotype.Service;
-
-@Service
-public class MyService implements IMyService {
-  @Override
-  public PersonBean hello(PersonBean a) {
-    return a;
-  }
-
-  @Override
-  public PersonBean[] helloBody(PersonBean[] a) {
-    return a;
-  }
-
-  @Override
-  public List<PersonBean> helloList(List<PersonBean> a) {
-    return a;
-  }
-
-  @Override
-  public PersonBean actual() {
-    PersonBean p = new PersonBean();
-    p.setName("p");
-    return p;
-  }
+  T[] getArray(T[] param);
 }
diff --git a/integration-tests/it-producer/src/main/java/org/apache/servicecomb/it/schema/generic/MyService.java b/swagger/swagger-generator/generator-core/src/test/java/org/apache/servicecomb/swagger/generator/core/utils/Hello2Endpoint.java
similarity index 63%
copy from integration-tests/it-producer/src/main/java/org/apache/servicecomb/it/schema/generic/MyService.java
copy to swagger/swagger-generator/generator-core/src/test/java/org/apache/servicecomb/swagger/generator/core/utils/Hello2Endpoint.java
index 51ef504..4f40fe7 100644
--- a/integration-tests/it-producer/src/main/java/org/apache/servicecomb/it/schema/generic/MyService.java
+++ b/swagger/swagger-generator/generator-core/src/test/java/org/apache/servicecomb/swagger/generator/core/utils/Hello2Endpoint.java
@@ -14,34 +14,21 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.servicecomb.it.schema.generic;
-
-
-import java.util.List;
-
-import org.springframework.stereotype.Service;
-
-@Service
-public class MyService implements IMyService {
-  @Override
-  public PersonBean hello(PersonBean a) {
-    return a;
-  }
+package org.apache.servicecomb.swagger.generator.core.utils;
 
+public class Hello2Endpoint implements ServiceInterface {
   @Override
-  public PersonBean[] helloBody(PersonBean[] a) {
-    return a;
+  public HelloBean get(HelloBean param) {
+    return param;
   }
 
   @Override
-  public List<PersonBean> helloList(List<PersonBean> a) {
-    return a;
+  public HelloBean[] getArray(HelloBean[] param) {
+    return new HelloBean[0];
   }
 
   @Override
-  public PersonBean actual() {
-    PersonBean p = new PersonBean();
-    p.setName("p");
-    return p;
+  public HelloBean getBase(HelloBean param) {
+    return param;
   }
 }
diff --git a/integration-tests/it-producer/src/main/java/org/apache/servicecomb/it/schema/generic/MyService.java b/swagger/swagger-generator/generator-core/src/test/java/org/apache/servicecomb/swagger/generator/core/utils/HelloBean.java
similarity index 60%
copy from integration-tests/it-producer/src/main/java/org/apache/servicecomb/it/schema/generic/MyService.java
copy to swagger/swagger-generator/generator-core/src/test/java/org/apache/servicecomb/swagger/generator/core/utils/HelloBean.java
index 51ef504..a380e7e 100644
--- a/integration-tests/it-producer/src/main/java/org/apache/servicecomb/it/schema/generic/MyService.java
+++ b/swagger/swagger-generator/generator-core/src/test/java/org/apache/servicecomb/swagger/generator/core/utils/HelloBean.java
@@ -14,34 +14,17 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.servicecomb.it.schema.generic;
 
+package org.apache.servicecomb.swagger.generator.core.utils;
 
-import java.util.List;
+public class HelloBean extends AbstractBean {
+  private String hello;
 
-import org.springframework.stereotype.Service;
-
-@Service
-public class MyService implements IMyService {
-  @Override
-  public PersonBean hello(PersonBean a) {
-    return a;
-  }
-
-  @Override
-  public PersonBean[] helloBody(PersonBean[] a) {
-    return a;
-  }
-
-  @Override
-  public List<PersonBean> helloList(List<PersonBean> a) {
-    return a;
+  public String getHello() {
+    return hello;
   }
 
-  @Override
-  public PersonBean actual() {
-    PersonBean p = new PersonBean();
-    p.setName("p");
-    return p;
+  public void setHello(String hello) {
+    this.hello = hello;
   }
 }
diff --git a/integration-tests/it-producer/src/main/java/org/apache/servicecomb/it/schema/generic/MyService.java b/swagger/swagger-generator/generator-core/src/test/java/org/apache/servicecomb/swagger/generator/core/utils/HelloEndpoint.java
similarity index 61%
copy from integration-tests/it-producer/src/main/java/org/apache/servicecomb/it/schema/generic/MyService.java
copy to swagger/swagger-generator/generator-core/src/test/java/org/apache/servicecomb/swagger/generator/core/utils/HelloEndpoint.java
index 51ef504..1901250 100644
--- a/integration-tests/it-producer/src/main/java/org/apache/servicecomb/it/schema/generic/MyService.java
+++ b/swagger/swagger-generator/generator-core/src/test/java/org/apache/servicecomb/swagger/generator/core/utils/HelloEndpoint.java
@@ -14,34 +14,12 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.servicecomb.it.schema.generic;
 
+package org.apache.servicecomb.swagger.generator.core.utils;
 
-import java.util.List;
-
-import org.springframework.stereotype.Service;
-
-@Service
-public class MyService implements IMyService {
-  @Override
-  public PersonBean hello(PersonBean a) {
-    return a;
-  }
-
-  @Override
-  public PersonBean[] helloBody(PersonBean[] a) {
-    return a;
-  }
-
-  @Override
-  public List<PersonBean> helloList(List<PersonBean> a) {
-    return a;
-  }
-
+public class HelloEndpoint extends AbstractBaseClass<HelloBean> {
   @Override
-  public PersonBean actual() {
-    PersonBean p = new PersonBean();
-    p.setName("p");
-    return p;
+  public HelloBean get(HelloBean param) {
+    return param;
   }
 }
diff --git a/integration-tests/it-producer/src/main/java/org/apache/servicecomb/it/schema/generic/MyService.java b/swagger/swagger-generator/generator-core/src/test/java/org/apache/servicecomb/swagger/generator/core/utils/ServiceInterface.java
similarity index 59%
copy from integration-tests/it-producer/src/main/java/org/apache/servicecomb/it/schema/generic/MyService.java
copy to swagger/swagger-generator/generator-core/src/test/java/org/apache/servicecomb/swagger/generator/core/utils/ServiceInterface.java
index 51ef504..ef58d03 100644
--- a/integration-tests/it-producer/src/main/java/org/apache/servicecomb/it/schema/generic/MyService.java
+++ b/swagger/swagger-generator/generator-core/src/test/java/org/apache/servicecomb/swagger/generator/core/utils/ServiceInterface.java
@@ -14,34 +14,9 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.servicecomb.it.schema.generic;
 
+package org.apache.servicecomb.swagger.generator.core.utils;
 
-import java.util.List;
-
-import org.springframework.stereotype.Service;
-
-@Service
-public class MyService implements IMyService {
-  @Override
-  public PersonBean hello(PersonBean a) {
-    return a;
-  }
-
-  @Override
-  public PersonBean[] helloBody(PersonBean[] a) {
-    return a;
-  }
-
-  @Override
-  public List<PersonBean> helloList(List<PersonBean> a) {
-    return a;
-  }
-
-  @Override
-  public PersonBean actual() {
-    PersonBean p = new PersonBean();
-    p.setName("p");
-    return p;
-  }
+public interface ServiceInterface extends BaseInterface<HelloBean> {
+  HelloBean getBase(HelloBean param);
 }
diff --git a/integration-tests/it-producer/src/main/java/org/apache/servicecomb/it/schema/generic/MyService.java b/swagger/swagger-generator/generator-core/src/test/java/org/apache/servicecomb/swagger/generator/core/utils/TestMethodUtils.java
similarity index 58%
copy from integration-tests/it-producer/src/main/java/org/apache/servicecomb/it/schema/generic/MyService.java
copy to swagger/swagger-generator/generator-core/src/test/java/org/apache/servicecomb/swagger/generator/core/utils/TestMethodUtils.java
index 51ef504..ee57577 100644
--- a/integration-tests/it-producer/src/main/java/org/apache/servicecomb/it/schema/generic/MyService.java
+++ b/swagger/swagger-generator/generator-core/src/test/java/org/apache/servicecomb/swagger/generator/core/utils/TestMethodUtils.java
@@ -14,34 +14,25 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.servicecomb.it.schema.generic;
 
+package org.apache.servicecomb.swagger.generator.core.utils;
 
+import java.lang.reflect.Method;
 import java.util.List;
 
-import org.springframework.stereotype.Service;
+import org.junit.Assert;
+import org.junit.Test;
 
-@Service
-public class MyService implements IMyService {
-  @Override
-  public PersonBean hello(PersonBean a) {
-    return a;
-  }
-
-  @Override
-  public PersonBean[] helloBody(PersonBean[] a) {
-    return a;
-  }
+public class TestMethodUtils {
+  @Test
+  public void testGetClassMethods() throws Exception {
+    List<Method> methods = MethodUtils.findProducerMethods(Hello2Endpoint.class);
+    Assert.assertEquals(3, methods.size());
 
-  @Override
-  public List<PersonBean> helloList(List<PersonBean> a) {
-    return a;
-  }
+    methods = MethodUtils.findProducerMethods(HelloEndpoint.class);
+    Assert.assertEquals(2, methods.size());
 
-  @Override
-  public PersonBean actual() {
-    PersonBean p = new PersonBean();
-    p.setName("p");
-    return p;
+    methods = MethodUtils.findProducerMethods(ServiceInterface.class);
+    Assert.assertEquals(3, methods.size());
   }
 }
diff --git a/swagger/swagger-invocation/invocation-core/src/main/java/org/apache/servicecomb/swagger/engine/SwaggerProducerOperation.java b/swagger/swagger-invocation/invocation-core/src/main/java/org/apache/servicecomb/swagger/engine/SwaggerProducerOperation.java
index cca21c5..5be9562 100644
--- a/swagger/swagger-invocation/invocation-core/src/main/java/org/apache/servicecomb/swagger/engine/SwaggerProducerOperation.java
+++ b/swagger/swagger-invocation/invocation-core/src/main/java/org/apache/servicecomb/swagger/engine/SwaggerProducerOperation.java
@@ -34,8 +34,12 @@ import org.apache.servicecomb.swagger.invocation.exception.ExceptionFactory;
 import org.apache.servicecomb.swagger.invocation.exception.InvocationException;
 import org.apache.servicecomb.swagger.invocation.extension.ProducerInvokeExtension;
 import org.apache.servicecomb.swagger.invocation.response.producer.ProducerResponseMapper;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 public class SwaggerProducerOperation {
+  private static final Logger LOGGER = LoggerFactory.getLogger(SwaggerProducerOperation.class);
+
   private String name;
 
   // 因为存在aop场景,所以,producerClass不一定等于producerInstance.getClass()
@@ -153,6 +157,9 @@ public class SwaggerProducerOperation {
       asyncResp.handle(processException(invocation,
           new InvocationException(Status.BAD_REQUEST.getStatusCode(), "",
               new CommonExceptionData("Parameters not valid or types not match."), ae)));
+      LOGGER.error("Parameters not valid or types not match {}, "
+              + "debug this line to find the actual decode errors.",
+          invocation.getInvocationQualifiedName());
     } catch (Throwable e) {
       invocation.onBusinessMethodFinish();
       invocation.onBusinessFinish();
@@ -189,6 +196,9 @@ public class SwaggerProducerOperation {
       response = processException(invocation,
           new InvocationException(Status.BAD_REQUEST.getStatusCode(), "",
               new CommonExceptionData("Parameters not valid or types not match."), ae));
+      LOGGER.error("Parameters not valid or types not match {}, "
+              + "debug this line to find the actual decode errors.",
+          invocation.getInvocationQualifiedName());
     } catch (Throwable e) {
       invocation.onBusinessMethodFinish();
       invocation.onBusinessFinish();


[servicecomb-java-chassis] 03/03: delete redundant logic

Posted by li...@apache.org.
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 3da6ff594df4efc22c0ef377b5a4b3f7e559a3df
Author: liubao <bi...@qq.com>
AuthorDate: Tue Aug 27 21:34:05 2019 +0800

    delete redundant logic
---
 .../org/apache/servicecomb/swagger/generator/core/SwaggerGenerator.java  | 1 -
 1 file changed, 1 deletion(-)

diff --git a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/SwaggerGenerator.java b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/SwaggerGenerator.java
index f4346f7..f05e276 100644
--- a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/SwaggerGenerator.java
+++ b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/SwaggerGenerator.java
@@ -238,7 +238,6 @@ public class SwaggerGenerator {
   protected void scanMethods() {
     // 有时方法顺序不同,很不利于测试,所以先排序
     List<Method> methods = MethodUtils.findProducerMethods(cls);
-    methods.sort(Comparator.comparing(Method::getName));
     for (Method method : methods) {
       if (isSkipMethod(method)) {
         continue;