This is an automated email from the ASF dual-hosted git repository. earthchen pushed a commit to branch 3.2 in repository https://gitbox.apache.org/repos/asf/dubbo.git
The following commit(s) were added to refs/heads/3.2 by this push: new 5554706256 Fix streamobserver actual type (#13446) 5554706256 is described below commit 5554706256c9daf550f36858e5bc3d17f3ec6143 Author: kaze <50894526+kazet...@users.noreply.github.com> AuthorDate: Wed Dec 6 10:57:09 2023 +0800 Fix streamobserver actual type (#13446) * fix:obtain actual type in StreamObserver. * format code --------- Co-authored-by: kaze <kaze-offic...@foxmail.com> --- .../rpc/protocol/tri/ReflectionPackableMethod.java | 24 ++++++++++------ .../apache/dubbo/rpc/protocol/tri/DataWrapper.java | 21 ++++++++++++++ .../dubbo/rpc/protocol/tri/DescriptorService.java | 11 ++++++++ .../protocol/tri/ReflectionPackableMethodTest.java | 32 ++++++++++++++++++++++ 4 files changed, 80 insertions(+), 8 deletions(-) diff --git a/dubbo-rpc/dubbo-rpc-triple/src/main/java/org/apache/dubbo/rpc/protocol/tri/ReflectionPackableMethod.java b/dubbo-rpc/dubbo-rpc-triple/src/main/java/org/apache/dubbo/rpc/protocol/tri/ReflectionPackableMethod.java index cb69e698c7..4c19ca2d12 100644 --- a/dubbo-rpc/dubbo-rpc-triple/src/main/java/org/apache/dubbo/rpc/protocol/tri/ReflectionPackableMethod.java +++ b/dubbo-rpc/dubbo-rpc-triple/src/main/java/org/apache/dubbo/rpc/protocol/tri/ReflectionPackableMethod.java @@ -33,6 +33,7 @@ import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.lang.reflect.ParameterizedType; +import java.lang.reflect.Type; import java.util.Collection; import java.util.Iterator; import java.util.stream.Stream; @@ -73,18 +74,18 @@ public class ReflectionPackableMethod implements PackableMethod { case CLIENT_STREAM: case BI_STREAM: actualRequestTypes = new Class<?>[] { - (Class<?>) - ((ParameterizedType) method.getMethod().getGenericReturnType()).getActualTypeArguments()[0] + obtainActualTypeInStreamObserver( + ((ParameterizedType) method.getMethod().getGenericReturnType()).getActualTypeArguments()[0]) }; - actualResponseType = - (Class<?>) ((ParameterizedType) method.getMethod().getGenericParameterTypes()[0]) - .getActualTypeArguments()[0]; + actualResponseType = obtainActualTypeInStreamObserver( + ((ParameterizedType) method.getMethod().getGenericParameterTypes()[0]) + .getActualTypeArguments()[0]); break; case SERVER_STREAM: actualRequestTypes = method.getMethod().getParameterTypes(); - actualResponseType = - (Class<?>) ((ParameterizedType) method.getMethod().getGenericParameterTypes()[1]) - .getActualTypeArguments()[0]; + actualResponseType = obtainActualTypeInStreamObserver( + ((ParameterizedType) method.getMethod().getGenericParameterTypes()[1]) + .getActualTypeArguments()[0]); break; case UNARY: actualRequestTypes = method.getParameterClasses(); @@ -290,6 +291,13 @@ public class ReflectionPackableMethod implements PackableMethod { return serializeType; } + static Class<?> obtainActualTypeInStreamObserver(Type typeInStreamObserver) { + return (Class<?>) + (typeInStreamObserver instanceof ParameterizedType + ? ((ParameterizedType) typeInStreamObserver).getRawType() + : typeInStreamObserver); + } + @Override public Pack getRequestPack() { return requestPack; diff --git a/dubbo-rpc/dubbo-rpc-triple/src/test/java/org/apache/dubbo/rpc/protocol/tri/DataWrapper.java b/dubbo-rpc/dubbo-rpc-triple/src/test/java/org/apache/dubbo/rpc/protocol/tri/DataWrapper.java new file mode 100644 index 0000000000..0157cfb4ec --- /dev/null +++ b/dubbo-rpc/dubbo-rpc-triple/src/test/java/org/apache/dubbo/rpc/protocol/tri/DataWrapper.java @@ -0,0 +1,21 @@ +/* + * 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.dubbo.rpc.protocol.tri; + +public class DataWrapper<T> { + public T data; +} diff --git a/dubbo-rpc/dubbo-rpc-triple/src/test/java/org/apache/dubbo/rpc/protocol/tri/DescriptorService.java b/dubbo-rpc/dubbo-rpc-triple/src/test/java/org/apache/dubbo/rpc/protocol/tri/DescriptorService.java index 7d93565c33..9457a951fa 100644 --- a/dubbo-rpc/dubbo-rpc-triple/src/test/java/org/apache/dubbo/rpc/protocol/tri/DescriptorService.java +++ b/dubbo-rpc/dubbo-rpc-triple/src/test/java/org/apache/dubbo/rpc/protocol/tri/DescriptorService.java @@ -68,6 +68,17 @@ public interface DescriptorService { void sayHelloServerStream2(Object request, StreamObserver<Object> reply); + /** + * obtain actual type in streamObserver + */ + void serverStream1(Object request, StreamObserver<String> streamObserver); + + void serverStream2(Object request, StreamObserver<DataWrapper<String>> streamObserver); + + StreamObserver<String> biStream1(StreamObserver<String> streamObserver); + + StreamObserver<DataWrapper<String>> biStream2(StreamObserver<DataWrapper<String>> streamObserver); + /***********************grpc******************************/ java.util.Iterator<HelloReply> iteratorServerStream(HelloReply request); diff --git a/dubbo-rpc/dubbo-rpc-triple/src/test/java/org/apache/dubbo/rpc/protocol/tri/ReflectionPackableMethodTest.java b/dubbo-rpc/dubbo-rpc-triple/src/test/java/org/apache/dubbo/rpc/protocol/tri/ReflectionPackableMethodTest.java index 46c79a9ae8..8682fd0acb 100644 --- a/dubbo-rpc/dubbo-rpc-triple/src/test/java/org/apache/dubbo/rpc/protocol/tri/ReflectionPackableMethodTest.java +++ b/dubbo-rpc/dubbo-rpc-triple/src/test/java/org/apache/dubbo/rpc/protocol/tri/ReflectionPackableMethodTest.java @@ -124,6 +124,38 @@ class ReflectionPackableMethodTest { Assertions.assertTrue(needWrap(descriptor2)); } + @Test + void testObtainActualType() throws NoSuchMethodException { + + Method method1 = DescriptorService.class.getMethod("serverStream1", Object.class, StreamObserver.class); + Class<?> clazz1 = ReflectionPackableMethod.obtainActualTypeInStreamObserver( + ((ParameterizedType) method1.getGenericParameterTypes()[1]).getActualTypeArguments()[0]); + Assertions.assertEquals(clazz1.getName(), String.class.getName()); + + Method method2 = DescriptorService.class.getMethod("serverStream2", Object.class, StreamObserver.class); + Class<?> clazz2 = ReflectionPackableMethod.obtainActualTypeInStreamObserver( + ((ParameterizedType) method2.getGenericParameterTypes()[1]).getActualTypeArguments()[0]); + Assertions.assertEquals(clazz2.getName(), DataWrapper.class.getName()); + + Method method3 = DescriptorService.class.getMethod("biStream1", StreamObserver.class); + Class<?> clazz31 = ReflectionPackableMethod.obtainActualTypeInStreamObserver( + ((ParameterizedType) method3.getGenericReturnType()).getActualTypeArguments()[0]); + Assertions.assertEquals(clazz31.getName(), String.class.getName()); + + Class<?> clazz32 = ReflectionPackableMethod.obtainActualTypeInStreamObserver( + ((ParameterizedType) method3.getGenericParameterTypes()[0]).getActualTypeArguments()[0]); + Assertions.assertEquals(clazz32.getName(), String.class.getName()); + + Method method4 = DescriptorService.class.getMethod("biStream2", StreamObserver.class); + Class<?> clazz41 = ReflectionPackableMethod.obtainActualTypeInStreamObserver( + ((ParameterizedType) method4.getGenericReturnType()).getActualTypeArguments()[0]); + Assertions.assertEquals(clazz41.getName(), DataWrapper.class.getName()); + + Class<?> clazz42 = ReflectionPackableMethod.obtainActualTypeInStreamObserver( + ((ParameterizedType) method4.getGenericParameterTypes()[0]).getActualTypeArguments()[0]); + Assertions.assertEquals(clazz42.getName(), DataWrapper.class.getName()); + } + @Test void testIsNeedWrap() throws NoSuchMethodException { Method method = DescriptorService.class.getMethod("noParameterMethod");