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

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


The following commit(s) were added to refs/heads/2.8.x by this push:
     new c086c4c9b [SCB-2794]process unknown parameters so that can compatible 
to old ve… (#3785) (#3787)
c086c4c9b is described below

commit c086c4c9bbd8ff6624ca7f9d257bddb06b50d3f6
Author: liubao68 <[email protected]>
AuthorDate: Fri May 19 19:43:11 2023 +0800

    [SCB-2794]process unknown parameters so that can compatible to old ve… 
(#3785) (#3787)
---
 .../pojo/client/ClientInterfaceForServerTest.java  | 27 +++++++++++++
 .../client/TestClientInterfaceForServerTest.java   | 47 ++++++++++++++++++++++
 .../arguments/AbstractArgumentsMapperCreator.java  | 13 +++---
 .../consumer/ConsumerArgumentsMapperCreator.java   | 27 ++++++++++++-
 .../producer/ProducerArgumentsMapperCreator.java   | 11 ++++-
 5 files changed, 113 insertions(+), 12 deletions(-)

diff --git 
a/demo/demo-pojo/pojo-client/src/main/java/org/apache/servicecomb/demo/pojo/client/ClientInterfaceForServerTest.java
 
b/demo/demo-pojo/pojo-client/src/main/java/org/apache/servicecomb/demo/pojo/client/ClientInterfaceForServerTest.java
new file mode 100644
index 000000000..34399d081
--- /dev/null
+++ 
b/demo/demo-pojo/pojo-client/src/main/java/org/apache/servicecomb/demo/pojo/client/ClientInterfaceForServerTest.java
@@ -0,0 +1,27 @@
+/*
+ * 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.demo.pojo.client;
+
+import org.apache.servicecomb.demo.server.TestRequest;
+import org.apache.servicecomb.demo.server.User;
+
+public interface ClientInterfaceForServerTest {
+    User splitParam(int nameNotIndex, User user);
+
+    User wrapParam(TestRequest nameNotRequest);
+}
diff --git 
a/demo/demo-pojo/pojo-client/src/main/java/org/apache/servicecomb/demo/pojo/client/TestClientInterfaceForServerTest.java
 
b/demo/demo-pojo/pojo-client/src/main/java/org/apache/servicecomb/demo/pojo/client/TestClientInterfaceForServerTest.java
new file mode 100644
index 000000000..bf0bcd6b6
--- /dev/null
+++ 
b/demo/demo-pojo/pojo-client/src/main/java/org/apache/servicecomb/demo/pojo/client/TestClientInterfaceForServerTest.java
@@ -0,0 +1,47 @@
+/*
+ * 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.demo.pojo.client;
+
+import org.apache.servicecomb.demo.CategorizedTestCase;
+import org.apache.servicecomb.demo.TestMgr;
+import org.apache.servicecomb.demo.server.TestRequest;
+import org.apache.servicecomb.demo.server.User;
+import org.apache.servicecomb.provider.pojo.RpcReference;
+import org.springframework.stereotype.Component;
+
+@Component
+public class TestClientInterfaceForServerTest implements CategorizedTestCase {
+    @RpcReference(microserviceName = "pojo", schemaId = "server")
+    private ClientInterfaceForServerTest pojo;
+
+    @Override
+    public void testAllTransport() throws Exception {
+        User user = new User();
+        user.setName("name");
+        user.setIndex(100);
+        User result = pojo.splitParam(100, user);
+        TestMgr.check("name,  users count:0", result.getName());
+        TestMgr.check(100, result.getIndex());
+
+        TestRequest request = new TestRequest();
+        request.setIndex(200);
+        request.setUser(user);
+        result = pojo.wrapParam(request);
+        TestMgr.check("name,  users count:0", result.getName());
+        TestMgr.check(200, result.getIndex());
+    }
+}
diff --git 
a/swagger/swagger-invocation/invocation-core/src/main/java/org/apache/servicecomb/swagger/invocation/arguments/AbstractArgumentsMapperCreator.java
 
b/swagger/swagger-invocation/invocation-core/src/main/java/org/apache/servicecomb/swagger/invocation/arguments/AbstractArgumentsMapperCreator.java
index e85e42398..5291399ac 100644
--- 
a/swagger/swagger-invocation/invocation-core/src/main/java/org/apache/servicecomb/swagger/invocation/arguments/AbstractArgumentsMapperCreator.java
+++ 
b/swagger/swagger-invocation/invocation-core/src/main/java/org/apache/servicecomb/swagger/invocation/arguments/AbstractArgumentsMapperCreator.java
@@ -28,9 +28,7 @@ import java.util.Set;
 import org.apache.servicecomb.swagger.SwaggerUtils;
 import org.apache.servicecomb.swagger.generator.core.model.SwaggerOperation;
 
-import com.fasterxml.jackson.databind.JavaType;
 import com.fasterxml.jackson.databind.SerializationConfig;
-import com.fasterxml.jackson.databind.type.TypeFactory;
 
 import io.swagger.models.parameters.BodyParameter;
 import io.swagger.models.parameters.Parameter;
@@ -174,13 +172,11 @@ public abstract class AbstractArgumentsMapperCreator {
         continue;
       }
 
-      JavaType providerType = 
TypeFactory.defaultInstance().constructType(providerParameter.getParameterizedType());
-      if (SwaggerUtils.isBean(providerType)) {
-        processBeanParameter(providerParamIdx, providerParameter);
+      if (processBeanParameter(providerParamIdx, providerParameter)) {
         continue;
       }
 
-      processUnknownParameter(parameterName);
+      processUnknownParameter(providerParamIdx, providerParameter, 
parameterName);
     }
 
     for (Parameter parameter : swaggerParameters) {
@@ -262,9 +258,10 @@ public abstract class AbstractArgumentsMapperCreator {
    * @param providerParamIdx
    * @param providerParameter processing provider parameter
    */
-  protected abstract void processBeanParameter(int providerParamIdx, 
java.lang.reflect.Parameter providerParameter);
+  protected abstract boolean processBeanParameter(int providerParamIdx, 
java.lang.reflect.Parameter providerParameter);
 
-  protected abstract void processUnknownParameter(String parameterName);
+  protected abstract void processUnknownParameter(int providerParamIdx, 
java.lang.reflect.Parameter providerParameter,
+      String parameterName);
 
   protected abstract void processPendingSwaggerParameter(Parameter parameter);
 }
diff --git 
a/swagger/swagger-invocation/invocation-core/src/main/java/org/apache/servicecomb/swagger/invocation/arguments/consumer/ConsumerArgumentsMapperCreator.java
 
b/swagger/swagger-invocation/invocation-core/src/main/java/org/apache/servicecomb/swagger/invocation/arguments/consumer/ConsumerArgumentsMapperCreator.java
index d74965c42..128a4ae60 100644
--- 
a/swagger/swagger-invocation/invocation-core/src/main/java/org/apache/servicecomb/swagger/invocation/arguments/consumer/ConsumerArgumentsMapperCreator.java
+++ 
b/swagger/swagger-invocation/invocation-core/src/main/java/org/apache/servicecomb/swagger/invocation/arguments/consumer/ConsumerArgumentsMapperCreator.java
@@ -23,6 +23,7 @@ import java.lang.reflect.Method;
 import java.util.Map;
 
 import org.apache.servicecomb.foundation.common.utils.LambdaMetafactoryUtils;
+import org.apache.servicecomb.swagger.SwaggerUtils;
 import org.apache.servicecomb.swagger.generator.core.model.SwaggerOperation;
 import 
org.apache.servicecomb.swagger.invocation.arguments.AbstractArgumentsMapperCreator;
 import org.apache.servicecomb.swagger.invocation.arguments.ArgumentMapper;
@@ -75,7 +76,22 @@ public class ConsumerArgumentsMapperCreator extends 
AbstractArgumentsMapperCreat
   }
 
   @Override
-  protected void processUnknownParameter(String parameterName) {
+  protected void processUnknownParameter(int providerParamIdx, 
java.lang.reflect.Parameter providerParameter,
+      String parameterName) {
+
+    // Make best guess, use the index of swagger to invoke server.
+    // For compatible to old version behavior
+    if (providerParamIdx < swaggerParameters.size()) {
+      Parameter parameter = swaggerParameters.get(providerParamIdx);
+      if (parameter != null) {
+        ArgumentMapper mapper = createKnownParameterMapper(providerParamIdx, 
providerParamIdx);
+        mappers.add(mapper);
+        LOGGER.warn("new consumer invoke old version producer, parameter({}) 
is not exist in contract, method={}:{}.",
+            parameterName, providerMethod.getDeclaringClass().getName(), 
providerMethod.getName());
+        return;
+      }
+    }
+
     // real unknown parameter, new consumer invoke old producer, just ignore 
this parameter
     LOGGER.warn("new consumer invoke old version producer, parameter({}) is 
not exist in contract, method={}:{}.",
         parameterName, providerMethod.getDeclaringClass().getName(), 
providerMethod.getName());
@@ -101,7 +117,12 @@ public class ConsumerArgumentsMapperCreator extends 
AbstractArgumentsMapperCreat
   }
 
   @Override
-  protected void processBeanParameter(int consumerParamIdx, 
java.lang.reflect.Parameter consumerParameter) {
+  protected boolean processBeanParameter(int consumerParamIdx, 
java.lang.reflect.Parameter consumerParameter) {
+    JavaType providerType = 
TypeFactory.defaultInstance().constructType(consumerParameter.getParameterizedType());
+    if (!SwaggerUtils.isBean(providerType)) {
+      return false;
+    }
+    boolean result = false;
     ConsumerBeanParamMapper mapper = new ConsumerBeanParamMapper(
         this.providerMethod.getParameters()[consumerParamIdx].getName());
     JavaType consumerType = 
TypeFactory.defaultInstance().constructType(consumerParameter.getParameterizedType());
@@ -118,7 +139,9 @@ public class ConsumerArgumentsMapperCreator extends 
AbstractArgumentsMapperCreat
 
       mapper.addField(parameterName, 
LambdaMetafactoryUtils.createObjectGetter(propertyDefinition));
       processedSwaggerParamters.add(parameterName);
+      result = true;
     }
     mappers.add(mapper);
+    return result;
   }
 }
diff --git 
a/swagger/swagger-invocation/invocation-core/src/main/java/org/apache/servicecomb/swagger/invocation/arguments/producer/ProducerArgumentsMapperCreator.java
 
b/swagger/swagger-invocation/invocation-core/src/main/java/org/apache/servicecomb/swagger/invocation/arguments/producer/ProducerArgumentsMapperCreator.java
index 852f008a8..1af538154 100644
--- 
a/swagger/swagger-invocation/invocation-core/src/main/java/org/apache/servicecomb/swagger/invocation/arguments/producer/ProducerArgumentsMapperCreator.java
+++ 
b/swagger/swagger-invocation/invocation-core/src/main/java/org/apache/servicecomb/swagger/invocation/arguments/producer/ProducerArgumentsMapperCreator.java
@@ -26,6 +26,7 @@ import java.util.HashMap;
 import java.util.Map;
 
 import org.apache.servicecomb.foundation.common.utils.LambdaMetafactoryUtils;
+import org.apache.servicecomb.swagger.SwaggerUtils;
 import org.apache.servicecomb.swagger.generator.core.model.SwaggerOperation;
 import 
org.apache.servicecomb.swagger.invocation.arguments.AbstractArgumentsMapperCreator;
 import org.apache.servicecomb.swagger.invocation.arguments.ArgumentMapper;
@@ -61,7 +62,8 @@ public class ProducerArgumentsMapperCreator extends 
AbstractArgumentsMapperCreat
   }
 
   @Override
-  protected void processUnknownParameter(String parameterName) {
+  protected void processUnknownParameter(int providerParamIdx, 
java.lang.reflect.Parameter providerParameter,
+      String parameterName) {
     throw new IllegalStateException(String
         .format("failed to find producer parameter in contract, method=%s:%s, 
parameter name=%s.",
             providerMethod.getDeclaringClass().getName(), 
providerMethod.getName(), parameterName));
@@ -97,7 +99,11 @@ public class ProducerArgumentsMapperCreator extends 
AbstractArgumentsMapperCreat
   }
 
   @Override
-  protected void processBeanParameter(int producerParamIdx, Parameter 
producerParameter) {
+  protected boolean processBeanParameter(int producerParamIdx, Parameter 
producerParameter) {
+    JavaType providerType = 
TypeFactory.defaultInstance().constructType(producerParameter.getParameterizedType());
+    if (!SwaggerUtils.isBean(providerType)) {
+      return false;
+    }
     ProducerBeanParamMapper mapper = new ProducerBeanParamMapper(
         providerMethod.getParameters()[producerParamIdx].getName(), 
producerParameter.getType());
     JavaType producerType = 
TypeFactory.defaultInstance().constructType(producerParameter.getParameterizedType());
@@ -117,5 +123,6 @@ public class ProducerArgumentsMapperCreator extends 
AbstractArgumentsMapperCreat
       processedSwaggerParamters.add(parameterName);
     }
     mappers.add(mapper);
+    return true;
   }
 }

Reply via email to