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


The following commit(s) were added to refs/heads/master by this push:
     new 77279e025 [SCB-2803]map java integer/bigdecimal to proto-buffer (#3916)
77279e025 is described below

commit 77279e025e3f96122571d9b471404e6913b4b0bf
Author: liubao68 <[email protected]>
AuthorDate: Sat Aug 26 09:49:19 2023 +0800

    [SCB-2803]map java integer/bigdecimal to proto-buffer (#3916)
---
 .../converter/SwaggerToProtoGenerator.java         |  11 +-
 .../protobuf/schema/SchemaToProtoGenerator.java    |  11 +-
 .../codec/protobuf/schema/TestSchemaCodec.java     |  57 +++++++++
 .../schema/TestSchemaToProtoGenerator.java         | 138 ++++++++++++---------
 .../codec/protobuf/schema/model/DeptInfo.java      |  13 ++
 .../schema/model/{DeptInfo.java => ScoreInfo.java} |  21 +---
 .../src/test/resources/ProtoSchema.proto           |  10 +-
 .../deserializer/scalar/SInt32ReadSchemas.java     |  55 +++++++-
 .../deserializer/scalar/StringReadSchemas.java     |  42 +++++++
 .../serializer/scalar/StringWriteSchemas.java      |   7 ++
 10 files changed, 276 insertions(+), 89 deletions(-)

diff --git 
a/common/common-protobuf/src/main/java/org/apache/servicecomb/codec/protobuf/internal/converter/SwaggerToProtoGenerator.java
 
b/common/common-protobuf/src/main/java/org/apache/servicecomb/codec/protobuf/internal/converter/SwaggerToProtoGenerator.java
index 6d00adeda..482808ab8 100644
--- 
a/common/common-protobuf/src/main/java/org/apache/servicecomb/codec/protobuf/internal/converter/SwaggerToProtoGenerator.java
+++ 
b/common/common-protobuf/src/main/java/org/apache/servicecomb/codec/protobuf/internal/converter/SwaggerToProtoGenerator.java
@@ -266,13 +266,16 @@ public class SwaggerToProtoGenerator {
     String key = swaggerType + ":" + swaggerFmt;
     return switch (key) {
       case "boolean:null" -> "bool";
-      case "integer:null", "integer:int64" -> "int64";
-      case "integer:int32" -> "int32";
-      case "number:null", "number:double" -> "double";
+      case "integer:int32" -> "sint32";
+      case "integer:int64" -> "sint64";
+      case "integer:null" -> "string";  // BigInteger like values
+      case "number:double" -> "double";
       case "number:float" -> "float";
+      case "number:null" -> "string";  // BigDecimal like values
       case "string:null" -> "string";
       case "string:byte" -> "bytes";
-      case "string:date", "string:date-time" -> "int64";
+      case "string:date" -> "int64";
+      case "string:date-time" -> "int64";
       case "string:binary" -> throw new IllegalArgumentException("proto buffer 
not support file upload/download");
       default -> null;
     };
diff --git 
a/common/common-protobuf/src/main/java/org/apache/servicecomb/codec/protobuf/schema/SchemaToProtoGenerator.java
 
b/common/common-protobuf/src/main/java/org/apache/servicecomb/codec/protobuf/schema/SchemaToProtoGenerator.java
index f100a5c14..9c2cf94d4 100644
--- 
a/common/common-protobuf/src/main/java/org/apache/servicecomb/codec/protobuf/schema/SchemaToProtoGenerator.java
+++ 
b/common/common-protobuf/src/main/java/org/apache/servicecomb/codec/protobuf/schema/SchemaToProtoGenerator.java
@@ -218,13 +218,16 @@ public class SchemaToProtoGenerator {
     String key = swaggerType + ":" + swaggerFmt;
     return switch (key) {
       case "boolean:null" -> "bool";
-      case "integer:null", "integer:int64" -> "int64";
-      case "integer:int32" -> "int32";
-      case "number:null", "number:double" -> "double";
+      case "integer:int32" -> "sint32";
+      case "integer:int64" -> "sint64";
+      case "integer:null" -> "string";  // BigInteger like values
+      case "number:double" -> "double";
       case "number:float" -> "float";
+      case "number:null" -> "string";  // BigDecimal like values
       case "string:null" -> "string";
       case "string:byte" -> "bytes";
-      case "string:date", "string:date-time" -> "int64";
+      case "string:date" -> "int64";
+      case "string:date-time" -> "int64";
       case "string:binary" -> throw new IllegalArgumentException("proto buffer 
not support file upload/download");
       default -> null;
     };
diff --git 
a/common/common-protobuf/src/test/java/org/apache/servicecomb/codec/protobuf/schema/TestSchemaCodec.java
 
b/common/common-protobuf/src/test/java/org/apache/servicecomb/codec/protobuf/schema/TestSchemaCodec.java
index a68ac1a1c..9eab70ae0 100644
--- 
a/common/common-protobuf/src/test/java/org/apache/servicecomb/codec/protobuf/schema/TestSchemaCodec.java
+++ 
b/common/common-protobuf/src/test/java/org/apache/servicecomb/codec/protobuf/schema/TestSchemaCodec.java
@@ -18,20 +18,29 @@ package org.apache.servicecomb.codec.protobuf.schema;
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
 
+import java.math.BigDecimal;
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 
+import org.apache.servicecomb.codec.protobuf.schema.model.DeptInfo;
+import org.apache.servicecomb.codec.protobuf.schema.model.SchemaService;
+import org.apache.servicecomb.codec.protobuf.schema.model.ScoreInfo;
+import org.apache.servicecomb.codec.protobuf.schema.model.UserInfo;
 import org.apache.servicecomb.codec.protobuf.utils.ScopedProtobufSchemaManager;
 import org.apache.servicecomb.foundation.protobuf.ProtoMapper;
 import org.apache.servicecomb.foundation.protobuf.RootDeserializer;
 import org.apache.servicecomb.foundation.protobuf.RootSerializer;
 import 
org.apache.servicecomb.foundation.protobuf.internal.bean.PropertyWrapper;
+import 
org.apache.servicecomb.swagger.generator.springmvc.SpringmvcSwaggerGenerator;
 import org.junit.jupiter.api.Test;
 
 import io.swagger.v3.oas.models.Components;
 import io.swagger.v3.oas.models.OpenAPI;
+import io.swagger.v3.oas.models.media.NumberSchema;
 import io.swagger.v3.oas.models.media.ObjectSchema;
 import io.swagger.v3.oas.models.media.StringSchema;
+import jakarta.ws.rs.core.MediaType;
 
 public class TestSchemaCodec {
   ScopedProtobufSchemaManager manager = new ScopedProtobufSchemaManager();
@@ -53,6 +62,24 @@ public class TestSchemaCodec {
     assertEquals("abcdefg", deserializedResult.getValue());
   }
 
+  @Test
+  public void test_number_schema_codec() throws Exception {
+    OpenAPI openAPI = new OpenAPI();
+    NumberSchema schema = new NumberSchema();
+    ProtoMapper protoMapper = manager.getOrCreateProtoMapper(openAPI, "test", 
"input", schema);
+    RootSerializer serializer = protoMapper.getSerializerSchemaManager()
+        .createRootSerializer(protoMapper.getProto().getMessage("input"),
+            BigDecimal.class);
+    Map<String, Object> arguments = new HashMap<>();
+    BigDecimal number = new BigDecimal(10);
+    arguments.put("value", number);
+    byte[] result = serializer.serialize(arguments);
+    RootDeserializer<PropertyWrapper<BigDecimal>> deserializer = 
protoMapper.getDeserializerSchemaManager()
+        .createRootDeserializer(protoMapper.getProto().getMessage("input"), 
BigDecimal.class);
+    PropertyWrapper<BigDecimal> deserializedResult = 
deserializer.deserialize(result);
+    assertEquals(number, deserializedResult.getValue());
+  }
+
   public static class User {
     public String name;
   }
@@ -84,4 +111,34 @@ public class TestSchemaCodec {
     PropertyWrapper<User> deserializedResult = 
deserializer.deserialize(result);
     assertEquals("abcdefg", deserializedResult.getValue().name);
   }
+
+  @Test
+  public void test_springmvc_model_schema_codec_correct() throws Exception {
+    SpringmvcSwaggerGenerator generator = new 
SpringmvcSwaggerGenerator(SchemaService.class);
+    OpenAPI openAPI = generator.generate();
+
+    ProtoMapper protoMapper = manager.getOrCreateProtoMapper(openAPI, 
"schemaService", "input",
+        openAPI.getPaths().get("/testUserInfo").getPost()
+            .getRequestBody().getContent().get(MediaType.APPLICATION_JSON)
+            .getSchema());
+    RootSerializer serializer = protoMapper.getSerializerSchemaManager()
+        .createRootSerializer(protoMapper.getProto().getMessage("input"),
+            UserInfo.class);
+    Map<String, Object> arguments = new HashMap<>();
+    UserInfo userInfo = new UserInfo();
+    DeptInfo deptInfo = new DeptInfo();
+    deptInfo.setCode("123");
+    ScoreInfo scoreInfo = new ScoreInfo();
+    scoreInfo.setType(233);
+    deptInfo.setScores(List.of(scoreInfo));
+    userInfo.setSubDeptInfos(List.of(deptInfo));
+    arguments.put("value", userInfo);
+    byte[] result = serializer.serialize(arguments);
+    RootDeserializer<PropertyWrapper<UserInfo>> deserializer = 
protoMapper.getDeserializerSchemaManager()
+        .createRootDeserializer(protoMapper.getProto().getMessage("input"), 
UserInfo.class);
+    PropertyWrapper<UserInfo> deserializedResult = 
deserializer.deserialize(result);
+    assertEquals(1, deserializedResult.getValue().getSubDeptInfos().size());
+    assertEquals("123", 
deserializedResult.getValue().getSubDeptInfos().get(0).getCode());
+    assertEquals(233, 
deserializedResult.getValue().getSubDeptInfos().get(0).getScores().get(0).getType());
+  }
 }
diff --git 
a/common/common-protobuf/src/test/java/org/apache/servicecomb/codec/protobuf/schema/TestSchemaToProtoGenerator.java
 
b/common/common-protobuf/src/test/java/org/apache/servicecomb/codec/protobuf/schema/TestSchemaToProtoGenerator.java
index 8daed9b39..930de8284 100644
--- 
a/common/common-protobuf/src/test/java/org/apache/servicecomb/codec/protobuf/schema/TestSchemaToProtoGenerator.java
+++ 
b/common/common-protobuf/src/test/java/org/apache/servicecomb/codec/protobuf/schema/TestSchemaToProtoGenerator.java
@@ -118,7 +118,7 @@ public class TestSchemaToProtoGenerator {
                 
         //@WrapProperty
         message testIntRequest {
-          int32 value = 1;
+          sint32 value = 1;
         }
         """.trim(), new ProtoToStringGenerator(proto).protoToString().trim());
 
@@ -134,7 +134,7 @@ public class TestSchemaToProtoGenerator {
                 
         //@WrapProperty
         message testIntResponse {
-          int32 value = 1;
+          sint32 value = 1;
         }
         """.trim(), new ProtoToStringGenerator(proto).protoToString().trim());
   }
@@ -157,7 +157,7 @@ public class TestSchemaToProtoGenerator {
                 
         message Model {
           string name = 1;
-          int32 age = 2;
+          sint32 age = 2;
         }
                 
         //@WrapProperty
@@ -178,7 +178,7 @@ public class TestSchemaToProtoGenerator {
                 
         message Model {
           string name = 1;
-          int32 age = 2;
+          sint32 age = 2;
         }
                 
         //@WrapProperty
@@ -199,44 +199,54 @@ public class TestSchemaToProtoGenerator {
                 .getSchema(), "request");
     Proto proto = protoGenerator.convert();
     assertEquals("""
-        syntax = "proto3";
-        package test.model;
-                
-        //@WrapProperty
-        message MapString {
-          map<string, string> value = 1;
-        }
-                
-        //@WrapProperty
-        message ListListString {
-          repeated ListString value = 1;
-        }
-                
-        message DeptInfo {
-          string name = 1;
-          string code = 2;
-        }
-                
-        //@WrapProperty
-        message ListString {
-          repeated string value = 1;
-        }
-                
-        message UserInfo {
-          repeated DeptInfo subDeptInfos = 1;
-          repeated MapString extraInfos = 2;
-          repeated ListListString nestedLists = 3;
-        }
-                
-        //@WrapProperty
-        message ListDeptInfo {
-          repeated DeptInfo value = 1;
-        }
-                
-        //@WrapProperty
-        message request {
-          UserInfo value = 1;
-        }
+       syntax = "proto3";
+       package test.model;
+       
+       //@WrapProperty
+       message MapString {
+         map<string, string> value = 1;
+       }
+       
+       //@WrapProperty
+       message ListListString {
+         repeated ListString value = 1;
+       }
+       
+       //@WrapProperty
+       message ListString {
+         repeated string value = 1;
+       }
+       
+       message ScoreInfo {
+         sint32 type = 1;
+       }
+       
+       message DeptInfo {
+         string name = 1;
+         string code = 2;
+         repeated ScoreInfo scores = 3;
+       }
+       
+       message UserInfo {
+         repeated DeptInfo subDeptInfos = 1;
+         repeated MapString extraInfos = 2;
+         repeated ListListString nestedLists = 3;
+       }
+       
+       //@WrapProperty
+       message ListScoreInfo {
+         repeated ScoreInfo value = 1;
+       }
+       
+       //@WrapProperty
+       message ListDeptInfo {
+         repeated DeptInfo value = 1;
+       }
+       
+       //@WrapProperty
+       message request {
+         UserInfo value = 1;
+       }
         """.trim(), new ProtoToStringGenerator(proto).protoToString().trim());
   }
 
@@ -251,23 +261,33 @@ public class TestSchemaToProtoGenerator {
                 .getSchema(), "request");
     Proto proto = protoGenerator.convert();
     assertEquals("""
-        syntax = "proto3";
-        package test.model;
-               
-        message DeptInfo {
-          string name = 1;
-          string code = 2;
-        }
-               
-        //@WrapProperty
-        message ListDeptInfo {
-          repeated DeptInfo value = 1;
-        }
-               
-        //@WrapProperty
-        message request {
-          repeated DeptInfo value = 1;
-        }
+       syntax = "proto3";
+       package test.model;
+       
+       message ScoreInfo {
+         sint32 type = 1;
+       }
+       
+       message DeptInfo {
+         string name = 1;
+         string code = 2;
+         repeated ScoreInfo scores = 3;
+       }
+       
+       //@WrapProperty
+       message ListScoreInfo {
+         repeated ScoreInfo value = 1;
+       }
+       
+       //@WrapProperty
+       message ListDeptInfo {
+         repeated DeptInfo value = 1;
+       }
+       
+       //@WrapProperty
+       message request {
+         repeated DeptInfo value = 1;
+       }
          """.trim(), new ProtoToStringGenerator(proto).protoToString().trim());
   }
 
diff --git 
a/common/common-protobuf/src/test/java/org/apache/servicecomb/codec/protobuf/schema/model/DeptInfo.java
 
b/common/common-protobuf/src/test/java/org/apache/servicecomb/codec/protobuf/schema/model/DeptInfo.java
index 1befcd119..713b45e02 100644
--- 
a/common/common-protobuf/src/test/java/org/apache/servicecomb/codec/protobuf/schema/model/DeptInfo.java
+++ 
b/common/common-protobuf/src/test/java/org/apache/servicecomb/codec/protobuf/schema/model/DeptInfo.java
@@ -16,10 +16,15 @@
  */
 package org.apache.servicecomb.codec.protobuf.schema.model;
 
+import java.util.List;
+
 public class DeptInfo {
   private String name;
+
   private String code;
 
+  private List<ScoreInfo> scores;
+
   public String getName() {
     return name;
   }
@@ -35,4 +40,12 @@ public class DeptInfo {
   public void setCode(String code) {
     this.code = code;
   }
+
+  public List<ScoreInfo> getScores() {
+    return scores;
+  }
+
+  public void setScores(List<ScoreInfo> scores) {
+    this.scores = scores;
+  }
 }
diff --git 
a/common/common-protobuf/src/test/java/org/apache/servicecomb/codec/protobuf/schema/model/DeptInfo.java
 
b/common/common-protobuf/src/test/java/org/apache/servicecomb/codec/protobuf/schema/model/ScoreInfo.java
similarity index 75%
copy from 
common/common-protobuf/src/test/java/org/apache/servicecomb/codec/protobuf/schema/model/DeptInfo.java
copy to 
common/common-protobuf/src/test/java/org/apache/servicecomb/codec/protobuf/schema/model/ScoreInfo.java
index 1befcd119..960ce7788 100644
--- 
a/common/common-protobuf/src/test/java/org/apache/servicecomb/codec/protobuf/schema/model/DeptInfo.java
+++ 
b/common/common-protobuf/src/test/java/org/apache/servicecomb/codec/protobuf/schema/model/ScoreInfo.java
@@ -16,23 +16,14 @@
  */
 package org.apache.servicecomb.codec.protobuf.schema.model;
 
-public class DeptInfo {
-  private String name;
-  private String code;
+public class ScoreInfo {
+  private Integer type;
 
-  public String getName() {
-    return name;
+  public Integer getType() {
+    return type;
   }
 
-  public void setName(String name) {
-    this.name = name;
-  }
-
-  public String getCode() {
-    return code;
-  }
-
-  public void setCode(String code) {
-    this.code = code;
+  public void setType(Integer type) {
+    this.type = type;
   }
 }
diff --git a/common/common-protobuf/src/test/resources/ProtoSchema.proto 
b/common/common-protobuf/src/test/resources/ProtoSchema.proto
index fcdeea027..bbb1a4769 100644
--- a/common/common-protobuf/src/test/resources/ProtoSchema.proto
+++ b/common/common-protobuf/src/test/resources/ProtoSchema.proto
@@ -52,12 +52,12 @@ message Ref2 {
 //@WrapArguments
 message BaseRequestWrap {
   bool boolValue = 1;
-  int32 iValue = 2;
-  int64 lValue = 3;
+  sint32 iValue = 2;
+  sint64 lValue = 3;
   float fValue = 4;
   double dValue = 5;
   string sValue = 6;
-  repeated int32 iArray = 7;
+  repeated sint32 iArray = 7;
   Enum_2610aa5dc6cd086cf20168892802c9c765a557f4951557340ad9f0982c53e055 color 
= 8;
   int64 localDate = 9;
   int64 date = 10;
@@ -66,7 +66,7 @@ message BaseRequestWrap {
 
 //@WrapProperty
 message BaseResponseWrap200 {
-  int32 value = 1;
+  sint32 value = 1;
 }
 
 //@WrapProperty
@@ -286,7 +286,7 @@ message TestTextPlainResponseWrap200 {
 
 //@WrapArguments
 message UserWrapInProtobufRequestWrap {
-  int32 ivalue = 1;
+  sint32 ivalue = 1;
   User user = 2;
 }
 
diff --git 
a/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/deserializer/scalar/SInt32ReadSchemas.java
 
b/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/deserializer/scalar/SInt32ReadSchemas.java
index 36621024b..8252e2a96 100644
--- 
a/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/deserializer/scalar/SInt32ReadSchemas.java
+++ 
b/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/deserializer/scalar/SInt32ReadSchemas.java
@@ -18,7 +18,9 @@ package 
org.apache.servicecomb.foundation.protobuf.internal.schema.deserializer.
 
 import java.io.IOException;
 
+import org.apache.servicecomb.foundation.common.utils.bean.ByteSetter;
 import org.apache.servicecomb.foundation.common.utils.bean.IntSetter;
+import org.apache.servicecomb.foundation.common.utils.bean.ShortSetter;
 import org.apache.servicecomb.foundation.protobuf.internal.ProtoUtils;
 import 
org.apache.servicecomb.foundation.protobuf.internal.bean.PropertyDescriptor;
 import 
org.apache.servicecomb.foundation.protobuf.internal.schema.deserializer.scalar.AbstractScalarReadSchemas.AbstractIntSchema;
@@ -36,7 +38,18 @@ public class SInt32ReadSchemas {
       return new SInt32PrimitiveSchema<>(protoField, propertyDescriptor);
     }
 
-    if (Integer.class.equals(javaType.getRawClass()) || 
javaType.isJavaLangObject()) {
+    if (short.class.equals(javaType.getRawClass())) {
+      return new ShortFieldSInt32PrimitiveSchema<>(protoField, 
propertyDescriptor);
+    }
+
+    if (byte.class.equals(javaType.getRawClass())) {
+      return new ByteFieldSInt32PrimitiveSchema<>(protoField, 
propertyDescriptor);
+    }
+
+    if (Integer.class.equals(javaType.getRawClass())
+        || Byte.class.equals(javaType.getRawClass())
+        || Short.class.equals(javaType.getRawClass())
+        || javaType.isJavaLangObject()) {
       return new SInt32Schema<>(protoField, propertyDescriptor);
     }
 
@@ -52,7 +65,13 @@ public class SInt32ReadSchemas {
     @Override
     public int mergeFrom(InputEx input, T message) throws IOException {
       int value = input.readSInt32();
-      setter.set(message, value);
+      if (Byte.class.equals(javaType.getRawClass())) {
+        setter.set(message, (byte) value);
+      } else if (Short.class.equals(javaType.getRawClass())) {
+        setter.set(message, (short) value);
+      } else {
+        setter.set(message, value);
+      }
       return input.readFieldNumber();
     }
   }
@@ -72,4 +91,36 @@ public class SInt32ReadSchemas {
       return input.readFieldNumber();
     }
   }
+
+  private static class ShortFieldSInt32PrimitiveSchema<T> extends 
FieldSchema<T> {
+    protected final ShortSetter<T> setter;
+
+    public ShortFieldSInt32PrimitiveSchema(Field protoField, 
PropertyDescriptor propertyDescriptor) {
+      super(protoField, propertyDescriptor.getJavaType());
+      this.setter = propertyDescriptor.getSetter();
+    }
+
+    @Override
+    public int mergeFrom(InputEx input, T message) throws IOException {
+      int value = input.readSInt32();
+      setter.set(message, (short) value);
+      return input.readFieldNumber();
+    }
+  }
+
+  private static class ByteFieldSInt32PrimitiveSchema<T> extends 
FieldSchema<T> {
+    protected final ByteSetter<T> setter;
+
+    public ByteFieldSInt32PrimitiveSchema(Field protoField, PropertyDescriptor 
propertyDescriptor) {
+      super(protoField, propertyDescriptor.getJavaType());
+      this.setter = propertyDescriptor.getSetter();
+    }
+
+    @Override
+    public int mergeFrom(InputEx input, T message) throws IOException {
+      int value = input.readSInt32();
+      setter.set(message, (byte) value);
+      return input.readFieldNumber();
+    }
+  }
 }
diff --git 
a/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/deserializer/scalar/StringReadSchemas.java
 
b/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/deserializer/scalar/StringReadSchemas.java
index 0edaa827b..7b1f0a441 100644
--- 
a/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/deserializer/scalar/StringReadSchemas.java
+++ 
b/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/deserializer/scalar/StringReadSchemas.java
@@ -17,6 +17,8 @@
 package 
org.apache.servicecomb.foundation.protobuf.internal.schema.deserializer.scalar;
 
 import java.io.IOException;
+import java.math.BigDecimal;
+import java.math.BigInteger;
 
 import org.apache.servicecomb.foundation.common.utils.bean.CharSetter;
 import org.apache.servicecomb.foundation.common.utils.bean.Setter;
@@ -42,6 +44,14 @@ public class StringReadSchemas {
       return new StringSchema<>(protoField, propertyDescriptor);
     }
 
+    if (BigDecimal.class.equals(javaType.getRawClass())) {
+      return new BigDecimalSchema<>(protoField, propertyDescriptor);
+    }
+
+    if (BigInteger.class.equals(javaType.getRawClass())) {
+      return new BigIntegerSchema<>(protoField, propertyDescriptor);
+    }
+
     ProtoUtils.throwNotSupportMerge(protoField, 
propertyDescriptor.getJavaType());
     return null;
   }
@@ -82,4 +92,36 @@ public class StringReadSchemas {
       return input.readFieldNumber();
     }
   }
+
+  private static class BigDecimalSchema<T> extends FieldSchema<T> {
+    private final Setter<T, Object> setter;
+
+    public BigDecimalSchema(Field protoField, PropertyDescriptor 
propertyDescriptor) {
+      super(protoField, propertyDescriptor.getJavaType());
+      this.setter = propertyDescriptor.getSetter();
+    }
+
+    @Override
+    public int mergeFrom(InputEx input, T message) throws IOException {
+      String value = input.readString();
+      setter.set(message, new BigDecimal(value));
+      return input.readFieldNumber();
+    }
+  }
+
+  private static class BigIntegerSchema<T> extends FieldSchema<T> {
+    private final Setter<T, Object> setter;
+
+    public BigIntegerSchema(Field protoField, PropertyDescriptor 
propertyDescriptor) {
+      super(protoField, propertyDescriptor.getJavaType());
+      this.setter = propertyDescriptor.getSetter();
+    }
+
+    @Override
+    public int mergeFrom(InputEx input, T message) throws IOException {
+      String value = input.readString();
+      setter.set(message, new BigInteger(value));
+      return input.readFieldNumber();
+    }
+  }
 }
diff --git 
a/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/serializer/scalar/StringWriteSchemas.java
 
b/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/serializer/scalar/StringWriteSchemas.java
index 34c8647ca..7df329b84 100644
--- 
a/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/serializer/scalar/StringWriteSchemas.java
+++ 
b/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/serializer/scalar/StringWriteSchemas.java
@@ -17,6 +17,8 @@
 package 
org.apache.servicecomb.foundation.protobuf.internal.schema.serializer.scalar;
 
 import java.io.IOException;
+import java.math.BigDecimal;
+import java.math.BigInteger;
 
 import org.apache.servicecomb.foundation.common.utils.bean.CharGetter;
 import org.apache.servicecomb.foundation.common.utils.bean.Getter;
@@ -65,6 +67,11 @@ public class StringWriteSchemas {
         return;
       }
 
+      if (value instanceof BigDecimal || value instanceof BigInteger) {
+        output.writeScalarString(tag, tagSize, value.toString());
+        return;
+      }
+
       ProtoUtils.throwNotSupportWrite(protoField, value);
     }
   }

Reply via email to