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);
}
}