diff --git a/dubbo-remoting/dubbo-remoting-http12/pom.xml b/dubbo-remoting/dubbo-remoting-http12/pom.xml index 514786699c..ad702991e9 100644 --- a/dubbo-remoting/dubbo-remoting-http12/pom.xml +++ b/dubbo-remoting/dubbo-remoting-http12/pom.xml @@ -46,6 +46,10 @@ dubbo-remoting-api ${project.parent.version} + + com.google.protobuf + protobuf-java-util + io.netty diff --git a/dubbo-remoting/dubbo-remoting-http12/src/main/java/org/apache/dubbo/remoting/http12/message/JsonCodec.java b/dubbo-remoting/dubbo-remoting-http12/src/main/java/org/apache/dubbo/remoting/http12/message/JsonCodec.java index fb6a6f6faa..819de6f420 100644 --- a/dubbo-remoting/dubbo-remoting-http12/src/main/java/org/apache/dubbo/remoting/http12/message/JsonCodec.java +++ b/dubbo-remoting/dubbo-remoting-http12/src/main/java/org/apache/dubbo/remoting/http12/message/JsonCodec.java @@ -17,8 +17,11 @@ package org.apache.dubbo.remoting.http12.message; import com.alibaba.fastjson2.JSONObject; +import com.google.protobuf.Message; +import com.google.protobuf.util.JsonFormat; import org.apache.dubbo.common.extension.Activate; import org.apache.dubbo.common.utils.JsonUtils; +import org.apache.dubbo.common.utils.MethodUtils; import org.apache.dubbo.remoting.http12.exception.DecodeException; import org.apache.dubbo.remoting.http12.exception.EncodeException; @@ -45,6 +48,11 @@ public class JsonCodec implements HttpMessageCodec { public void encode(OutputStream outputStream, Object unSerializedBody) throws EncodeException { try { try { + if (unSerializedBody instanceof Message) { + String jsonString = JsonFormat.printer().print((Message) unSerializedBody); + outputStream.write(jsonString.getBytes(StandardCharsets.UTF_8)); + return; + } String jsonString = JsonUtils.toJson(unSerializedBody); outputStream.write(jsonString.getBytes(StandardCharsets.UTF_8)); } finally { @@ -79,6 +87,11 @@ public class JsonCodec implements HttpMessageCodec { while ((len = body.read(data)) != -1) { builder.append(new String(data, 0, len)); } + if (isProtobuf(targetType)) { + Message.Builder newBuilder = (Message.Builder) MethodUtils.findMethod(targetType, "newBuilder").invoke(null); + JsonFormat.parser().ignoringUnknownFields().merge(builder.toString(), newBuilder); + return newBuilder.build(); + } return JsonUtils.toJavaObject(builder.toString(), targetType); } finally { body.close(); @@ -124,4 +137,11 @@ public class JsonCodec implements HttpMessageCodec { } } + private boolean isProtobuf(Class targetType) { + if (targetType == null) { + return false; + } + return Message.class.isAssignableFrom(targetType); + } + } diff --git a/dubbo-rpc/dubbo-rpc-triple/src/main/java/org/apache/dubbo/rpc/protocol/tri/h12/AbstractServerTransportListener.java b/dubbo-rpc/dubbo-rpc-triple/src/main/java/org/apache/dubbo/rpc/protocol/tri/h12/AbstractServerTransportListener.java index 1e442d1e5c..a80785ab13 100644 --- a/dubbo-rpc/dubbo-rpc-triple/src/main/java/org/apache/dubbo/rpc/protocol/tri/h12/AbstractServerTransportListener.java +++ b/dubbo-rpc/dubbo-rpc-triple/src/main/java/org/apache/dubbo/rpc/protocol/tri/h12/AbstractServerTransportListener.java @@ -118,10 +118,12 @@ public abstract class AbstractServerTransportListener