You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@servicecomb.apache.org by li...@apache.org on 2020/02/06 08:35:21 UTC

[servicecomb-java-chassis] branch master updated: [SCB-1744]separate primitive descriptorParamType from non primitive

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 fcf298c  [SCB-1744]separate primitive descriptorParamType from non primitive
fcf298c is described below

commit fcf298c6573a85085270653b8f9a6cbab1793600
Author: liubao <bi...@qq.com>
AuthorDate: Wed Feb 5 22:03:14 2020 +0800

    [SCB-1744]separate primitive descriptorParamType from non primitive
---
 .../converter/TestSchemaMetaCodecRestTemplate.java |  1 -
 .../common/utils/LambdaMetafactoryUtils.java       | 51 ++++++++++++++++--
 .../foundation/common/utils/bean/BoolGetter.java   | 21 ++++++++
 .../foundation/common/utils/bean/BoolSetter.java   | 21 ++++++++
 .../foundation/common/utils/bean/ByteGetter.java   | 21 ++++++++
 .../foundation/common/utils/bean/ByteSetter.java   | 21 ++++++++
 .../foundation/common/utils/bean/CharGetter.java   | 21 ++++++++
 .../foundation/common/utils/bean/CharSetter.java   | 21 ++++++++
 .../foundation/common/utils/bean/DoubleGetter.java | 21 ++++++++
 .../foundation/common/utils/bean/DoubleSetter.java | 21 ++++++++
 .../foundation/common/utils/bean/FloatGetter.java  | 21 ++++++++
 .../foundation/common/utils/bean/FloatSetter.java  | 21 ++++++++
 .../foundation/common/utils/bean/IntGetter.java    | 21 ++++++++
 .../foundation/common/utils/bean/IntSetter.java    | 21 ++++++++
 .../foundation/common/utils/bean/LongGetter.java   | 21 ++++++++
 .../foundation/common/utils/bean/LongSetter.java   | 21 ++++++++
 .../foundation/common/utils/bean/ShortGetter.java  | 21 ++++++++
 .../foundation/common/utils/bean/ShortSetter.java  | 21 ++++++++
 .../common/utils/TestLambdaMetafactoryUtils.java   |  6 ++-
 .../common/utils/TestLambdaPerformance.java        |  3 +-
 .../scalar/AbstractScalarReadSchemas.java          | 18 -------
 .../deserializer/scalar/BoolReadSchemas.java       |  3 +-
 .../deserializer/scalar/DoubleReadSchemas.java     |  3 +-
 .../deserializer/scalar/EnumsReadSchemas.java      |  3 +-
 .../deserializer/scalar/Fixed32ReadSchemas.java    |  9 ++--
 .../deserializer/scalar/Fixed64ReadSchemas.java    |  9 ++--
 .../deserializer/scalar/FloatReadSchemas.java      |  3 +-
 .../deserializer/scalar/Int32ReadSchemas.java      | 62 ++++++++++++++++++----
 .../deserializer/scalar/Int64ReadSchemas.java      | 13 +++--
 .../deserializer/scalar/SFixed32ReadSchemas.java   |  9 ++--
 .../deserializer/scalar/SFixed64ReadSchemas.java   |  9 ++--
 .../deserializer/scalar/SInt32ReadSchemas.java     |  9 ++--
 .../deserializer/scalar/SInt64ReadSchemas.java     |  9 ++--
 .../deserializer/scalar/StringReadSchemas.java     | 26 ++++++++-
 .../deserializer/scalar/UInt32ReadSchemas.java     |  9 ++--
 .../deserializer/scalar/UInt64ReadSchemas.java     |  9 ++--
 .../schema/serializer/scalar/BoolWriteSchemas.java |  3 +-
 .../serializer/scalar/DoubleWriteSchemas.java      |  3 +-
 .../serializer/scalar/Fixed32WriteSchemas.java     |  3 +-
 .../serializer/scalar/Fixed64WriteSchemas.java     |  3 +-
 .../serializer/scalar/FloatWriteSchemas.java       |  3 +-
 .../serializer/scalar/Int32WriteSchemas.java       | 51 +++++++++++++++---
 .../serializer/scalar/Int64WriteSchemas.java       |  3 +-
 .../serializer/scalar/SFixed32WriteSchemas.java    |  3 +-
 .../serializer/scalar/SFixed64WriteSchemas.java    |  3 +-
 .../serializer/scalar/SInt32WriteSchemas.java      |  3 +-
 .../serializer/scalar/SInt64WriteSchemas.java      |  3 +-
 .../serializer/scalar/StringWriteSchemas.java      | 23 +++++++-
 .../serializer/scalar/UInt32WriteSchemas.java      |  3 +-
 .../serializer/scalar/UInt64WriteSchemas.java      |  3 +-
 .../internal/bean/TestBeanDescriptorManager.java   | 10 ++--
 .../schema/objectparams/FlattenObjectRequest.java  | 23 ++++++++
 .../objectparams/TestSpringMVCObjectParamType.java | 37 +++----------
 53 files changed, 658 insertions(+), 122 deletions(-)

diff --git a/common/common-protobuf/src/test/java/org/apache/servicecomb/codec/protobuf/internal/converter/TestSchemaMetaCodecRestTemplate.java b/common/common-protobuf/src/test/java/org/apache/servicecomb/codec/protobuf/internal/converter/TestSchemaMetaCodecRestTemplate.java
index 0472b37..191a419 100644
--- a/common/common-protobuf/src/test/java/org/apache/servicecomb/codec/protobuf/internal/converter/TestSchemaMetaCodecRestTemplate.java
+++ b/common/common-protobuf/src/test/java/org/apache/servicecomb/codec/protobuf/internal/converter/TestSchemaMetaCodecRestTemplate.java
@@ -18,7 +18,6 @@
 package org.apache.servicecomb.codec.protobuf.internal.converter;
 
 import java.time.LocalDate;
-import java.time.temporal.ChronoField;
 import java.util.ArrayList;
 import java.util.Date;
 import java.util.HashMap;
diff --git a/foundations/foundation-common/src/main/java/org/apache/servicecomb/foundation/common/utils/LambdaMetafactoryUtils.java b/foundations/foundation-common/src/main/java/org/apache/servicecomb/foundation/common/utils/LambdaMetafactoryUtils.java
index 6152f4c..da690b5 100644
--- a/foundations/foundation-common/src/main/java/org/apache/servicecomb/foundation/common/utils/LambdaMetafactoryUtils.java
+++ b/foundations/foundation-common/src/main/java/org/apache/servicecomb/foundation/common/utils/LambdaMetafactoryUtils.java
@@ -25,9 +25,27 @@ import java.lang.invoke.MethodType;
 import java.lang.reflect.Field;
 import java.lang.reflect.Method;
 import java.lang.reflect.Modifier;
-
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.servicecomb.foundation.common.utils.bean.BoolGetter;
+import org.apache.servicecomb.foundation.common.utils.bean.BoolSetter;
+import org.apache.servicecomb.foundation.common.utils.bean.ByteGetter;
+import org.apache.servicecomb.foundation.common.utils.bean.ByteSetter;
+import org.apache.servicecomb.foundation.common.utils.bean.CharGetter;
+import org.apache.servicecomb.foundation.common.utils.bean.CharSetter;
+import org.apache.servicecomb.foundation.common.utils.bean.DoubleGetter;
+import org.apache.servicecomb.foundation.common.utils.bean.DoubleSetter;
+import org.apache.servicecomb.foundation.common.utils.bean.FloatGetter;
+import org.apache.servicecomb.foundation.common.utils.bean.FloatSetter;
 import org.apache.servicecomb.foundation.common.utils.bean.Getter;
+import org.apache.servicecomb.foundation.common.utils.bean.IntGetter;
+import org.apache.servicecomb.foundation.common.utils.bean.IntSetter;
+import org.apache.servicecomb.foundation.common.utils.bean.LongGetter;
+import org.apache.servicecomb.foundation.common.utils.bean.LongSetter;
 import org.apache.servicecomb.foundation.common.utils.bean.Setter;
+import org.apache.servicecomb.foundation.common.utils.bean.ShortGetter;
+import org.apache.servicecomb.foundation.common.utils.bean.ShortSetter;
 
 public final class LambdaMetafactoryUtils {
   private static Field allowedModesField;
@@ -37,8 +55,33 @@ public final class LambdaMetafactoryUtils {
 
   private static final Lookup LOOKUP = MethodHandles.lookup();
 
+  private static final Map<Class<?>, Class<?>> GETTER_MAP = new HashMap<>();
+
+  private static final Map<Class<?>, Class<?>> SETTER_MAP = new HashMap<>();
+
   static {
     enhanceLambda();
+    initGetterSetterMap();
+  }
+
+  private static void initGetterSetterMap() {
+    GETTER_MAP.put(boolean.class, BoolGetter.class);
+    GETTER_MAP.put(byte.class, ByteGetter.class);
+    GETTER_MAP.put(char.class, CharGetter.class);
+    GETTER_MAP.put(short.class, ShortGetter.class);
+    GETTER_MAP.put(int.class, IntGetter.class);
+    GETTER_MAP.put(long.class, LongGetter.class);
+    GETTER_MAP.put(float.class, FloatGetter.class);
+    GETTER_MAP.put(double.class, DoubleGetter.class);
+
+    SETTER_MAP.put(boolean.class, BoolSetter.class);
+    SETTER_MAP.put(byte.class, ByteSetter.class);
+    SETTER_MAP.put(char.class, CharSetter.class);
+    SETTER_MAP.put(short.class, ShortSetter.class);
+    SETTER_MAP.put(int.class, IntSetter.class);
+    SETTER_MAP.put(long.class, LongSetter.class);
+    SETTER_MAP.put(float.class, FloatSetter.class);
+    SETTER_MAP.put(double.class, DoubleSetter.class);
   }
 
   private static void enhanceLambda() {
@@ -124,7 +167,8 @@ public final class LambdaMetafactoryUtils {
   }
 
   public static <T> T createGetter(Method getMethod) {
-    return createLambda(getMethod, Getter.class);
+    Class<?> getterCls = GETTER_MAP.getOrDefault(getMethod.getReturnType(), Getter.class);
+    return createLambda(getMethod, getterCls);
   }
 
   // slower than reflect directly
@@ -141,7 +185,8 @@ public final class LambdaMetafactoryUtils {
   }
 
   public static <T> T createSetter(Method setMethod) throws Throwable {
-    return createLambda(setMethod, Setter.class);
+    Class<?> setterCls = SETTER_MAP.getOrDefault(setMethod.getParameterTypes()[0], Setter.class);
+    return createLambda(setMethod, setterCls);
   }
 
   // slower than reflect directly
diff --git a/foundations/foundation-common/src/main/java/org/apache/servicecomb/foundation/common/utils/bean/BoolGetter.java b/foundations/foundation-common/src/main/java/org/apache/servicecomb/foundation/common/utils/bean/BoolGetter.java
new file mode 100644
index 0000000..11e0a3c
--- /dev/null
+++ b/foundations/foundation-common/src/main/java/org/apache/servicecomb/foundation/common/utils/bean/BoolGetter.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.servicecomb.foundation.common.utils.bean;
+
+public interface BoolGetter<T> {
+  boolean get(T instance);
+}
diff --git a/foundations/foundation-common/src/main/java/org/apache/servicecomb/foundation/common/utils/bean/BoolSetter.java b/foundations/foundation-common/src/main/java/org/apache/servicecomb/foundation/common/utils/bean/BoolSetter.java
new file mode 100644
index 0000000..8cbacb5
--- /dev/null
+++ b/foundations/foundation-common/src/main/java/org/apache/servicecomb/foundation/common/utils/bean/BoolSetter.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.servicecomb.foundation.common.utils.bean;
+
+public interface BoolSetter<T> {
+  void set(T instance, boolean value);
+}
diff --git a/foundations/foundation-common/src/main/java/org/apache/servicecomb/foundation/common/utils/bean/ByteGetter.java b/foundations/foundation-common/src/main/java/org/apache/servicecomb/foundation/common/utils/bean/ByteGetter.java
new file mode 100644
index 0000000..c4bab67
--- /dev/null
+++ b/foundations/foundation-common/src/main/java/org/apache/servicecomb/foundation/common/utils/bean/ByteGetter.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.servicecomb.foundation.common.utils.bean;
+
+public interface ByteGetter<T> {
+  byte get(T instance);
+}
diff --git a/foundations/foundation-common/src/main/java/org/apache/servicecomb/foundation/common/utils/bean/ByteSetter.java b/foundations/foundation-common/src/main/java/org/apache/servicecomb/foundation/common/utils/bean/ByteSetter.java
new file mode 100644
index 0000000..952d06b
--- /dev/null
+++ b/foundations/foundation-common/src/main/java/org/apache/servicecomb/foundation/common/utils/bean/ByteSetter.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.servicecomb.foundation.common.utils.bean;
+
+public interface ByteSetter<T> {
+  void set(T instance, byte value);
+}
diff --git a/foundations/foundation-common/src/main/java/org/apache/servicecomb/foundation/common/utils/bean/CharGetter.java b/foundations/foundation-common/src/main/java/org/apache/servicecomb/foundation/common/utils/bean/CharGetter.java
new file mode 100644
index 0000000..2e09c98
--- /dev/null
+++ b/foundations/foundation-common/src/main/java/org/apache/servicecomb/foundation/common/utils/bean/CharGetter.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.servicecomb.foundation.common.utils.bean;
+
+public interface CharGetter<T> {
+  char get(T instance);
+}
diff --git a/foundations/foundation-common/src/main/java/org/apache/servicecomb/foundation/common/utils/bean/CharSetter.java b/foundations/foundation-common/src/main/java/org/apache/servicecomb/foundation/common/utils/bean/CharSetter.java
new file mode 100644
index 0000000..e022fa3
--- /dev/null
+++ b/foundations/foundation-common/src/main/java/org/apache/servicecomb/foundation/common/utils/bean/CharSetter.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.servicecomb.foundation.common.utils.bean;
+
+public interface CharSetter<T> {
+  void set(T instance, char value);
+}
diff --git a/foundations/foundation-common/src/main/java/org/apache/servicecomb/foundation/common/utils/bean/DoubleGetter.java b/foundations/foundation-common/src/main/java/org/apache/servicecomb/foundation/common/utils/bean/DoubleGetter.java
new file mode 100644
index 0000000..5349c4c
--- /dev/null
+++ b/foundations/foundation-common/src/main/java/org/apache/servicecomb/foundation/common/utils/bean/DoubleGetter.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.servicecomb.foundation.common.utils.bean;
+
+public interface DoubleGetter<T> {
+  double get(T instance);
+}
diff --git a/foundations/foundation-common/src/main/java/org/apache/servicecomb/foundation/common/utils/bean/DoubleSetter.java b/foundations/foundation-common/src/main/java/org/apache/servicecomb/foundation/common/utils/bean/DoubleSetter.java
new file mode 100644
index 0000000..c39a802
--- /dev/null
+++ b/foundations/foundation-common/src/main/java/org/apache/servicecomb/foundation/common/utils/bean/DoubleSetter.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.servicecomb.foundation.common.utils.bean;
+
+public interface DoubleSetter<T> {
+  void set(T instance, double value);
+}
diff --git a/foundations/foundation-common/src/main/java/org/apache/servicecomb/foundation/common/utils/bean/FloatGetter.java b/foundations/foundation-common/src/main/java/org/apache/servicecomb/foundation/common/utils/bean/FloatGetter.java
new file mode 100644
index 0000000..405d233
--- /dev/null
+++ b/foundations/foundation-common/src/main/java/org/apache/servicecomb/foundation/common/utils/bean/FloatGetter.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.servicecomb.foundation.common.utils.bean;
+
+public interface FloatGetter<T> {
+  float get(T instance);
+}
diff --git a/foundations/foundation-common/src/main/java/org/apache/servicecomb/foundation/common/utils/bean/FloatSetter.java b/foundations/foundation-common/src/main/java/org/apache/servicecomb/foundation/common/utils/bean/FloatSetter.java
new file mode 100644
index 0000000..7d4b75a
--- /dev/null
+++ b/foundations/foundation-common/src/main/java/org/apache/servicecomb/foundation/common/utils/bean/FloatSetter.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.servicecomb.foundation.common.utils.bean;
+
+public interface FloatSetter<T> {
+  void set(T instance, float value);
+}
diff --git a/foundations/foundation-common/src/main/java/org/apache/servicecomb/foundation/common/utils/bean/IntGetter.java b/foundations/foundation-common/src/main/java/org/apache/servicecomb/foundation/common/utils/bean/IntGetter.java
new file mode 100644
index 0000000..b7aaf29
--- /dev/null
+++ b/foundations/foundation-common/src/main/java/org/apache/servicecomb/foundation/common/utils/bean/IntGetter.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.servicecomb.foundation.common.utils.bean;
+
+public interface IntGetter<T> {
+  int get(T instance);
+}
diff --git a/foundations/foundation-common/src/main/java/org/apache/servicecomb/foundation/common/utils/bean/IntSetter.java b/foundations/foundation-common/src/main/java/org/apache/servicecomb/foundation/common/utils/bean/IntSetter.java
new file mode 100644
index 0000000..0a0425e
--- /dev/null
+++ b/foundations/foundation-common/src/main/java/org/apache/servicecomb/foundation/common/utils/bean/IntSetter.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.servicecomb.foundation.common.utils.bean;
+
+public interface IntSetter<T> {
+  void set(T instance, int value);
+}
diff --git a/foundations/foundation-common/src/main/java/org/apache/servicecomb/foundation/common/utils/bean/LongGetter.java b/foundations/foundation-common/src/main/java/org/apache/servicecomb/foundation/common/utils/bean/LongGetter.java
new file mode 100644
index 0000000..8f4d68d
--- /dev/null
+++ b/foundations/foundation-common/src/main/java/org/apache/servicecomb/foundation/common/utils/bean/LongGetter.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.servicecomb.foundation.common.utils.bean;
+
+public interface LongGetter<T> {
+  long get(T instance);
+}
diff --git a/foundations/foundation-common/src/main/java/org/apache/servicecomb/foundation/common/utils/bean/LongSetter.java b/foundations/foundation-common/src/main/java/org/apache/servicecomb/foundation/common/utils/bean/LongSetter.java
new file mode 100644
index 0000000..a0ba4f9
--- /dev/null
+++ b/foundations/foundation-common/src/main/java/org/apache/servicecomb/foundation/common/utils/bean/LongSetter.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.servicecomb.foundation.common.utils.bean;
+
+public interface LongSetter<T> {
+  void set(T instance, long value);
+}
diff --git a/foundations/foundation-common/src/main/java/org/apache/servicecomb/foundation/common/utils/bean/ShortGetter.java b/foundations/foundation-common/src/main/java/org/apache/servicecomb/foundation/common/utils/bean/ShortGetter.java
new file mode 100644
index 0000000..bea64f4
--- /dev/null
+++ b/foundations/foundation-common/src/main/java/org/apache/servicecomb/foundation/common/utils/bean/ShortGetter.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.servicecomb.foundation.common.utils.bean;
+
+public interface ShortGetter<T> {
+  short get(T instance);
+}
diff --git a/foundations/foundation-common/src/main/java/org/apache/servicecomb/foundation/common/utils/bean/ShortSetter.java b/foundations/foundation-common/src/main/java/org/apache/servicecomb/foundation/common/utils/bean/ShortSetter.java
new file mode 100644
index 0000000..db741cb
--- /dev/null
+++ b/foundations/foundation-common/src/main/java/org/apache/servicecomb/foundation/common/utils/bean/ShortSetter.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.servicecomb.foundation.common.utils.bean;
+
+public interface ShortSetter<T> {
+  void set(T instance, short value);
+}
diff --git a/foundations/foundation-common/src/test/java/org/apache/servicecomb/foundation/common/utils/TestLambdaMetafactoryUtils.java b/foundations/foundation-common/src/test/java/org/apache/servicecomb/foundation/common/utils/TestLambdaMetafactoryUtils.java
index fc4f39b..40672cb 100644
--- a/foundations/foundation-common/src/test/java/org/apache/servicecomb/foundation/common/utils/TestLambdaMetafactoryUtils.java
+++ b/foundations/foundation-common/src/test/java/org/apache/servicecomb/foundation/common/utils/TestLambdaMetafactoryUtils.java
@@ -25,6 +25,8 @@ import java.util.function.Function;
 import java.util.function.Supplier;
 
 import org.apache.servicecomb.foundation.common.utils.bean.Getter;
+import org.apache.servicecomb.foundation.common.utils.bean.IntGetter;
+import org.apache.servicecomb.foundation.common.utils.bean.IntSetter;
 import org.apache.servicecomb.foundation.common.utils.bean.Setter;
 import org.hamcrest.Matchers;
 import org.junit.Assert;
@@ -68,8 +70,8 @@ public class TestLambdaMetafactoryUtils {
   @SuppressWarnings("unchecked")
   @Test
   public void createGetterSetterByMethod() throws Throwable {
-    Getter<Model, Integer> getter = LambdaMetafactoryUtils.createGetter(Model.class.getMethod("getF1"));
-    Setter<Model, Integer> setter = LambdaMetafactoryUtils.createSetter(Model.class.getMethod("setF1", int.class));
+    IntGetter<Model> getter = LambdaMetafactoryUtils.createGetter(Model.class.getMethod("getF1"));
+    IntSetter<Model> setter = LambdaMetafactoryUtils.createSetter(Model.class.getMethod("setF1", int.class));
     BiFunction<Object, Object, Object> echo = LambdaMetafactoryUtils
         .createLambda(Model.class.getMethod("echo", List.class), BiFunction.class);
 
diff --git a/foundations/foundation-common/src/test/java/org/apache/servicecomb/foundation/common/utils/TestLambdaPerformance.java b/foundations/foundation-common/src/test/java/org/apache/servicecomb/foundation/common/utils/TestLambdaPerformance.java
index d60c068..ab92c86 100644
--- a/foundations/foundation-common/src/test/java/org/apache/servicecomb/foundation/common/utils/TestLambdaPerformance.java
+++ b/foundations/foundation-common/src/test/java/org/apache/servicecomb/foundation/common/utils/TestLambdaPerformance.java
@@ -24,6 +24,7 @@ import java.lang.reflect.Method;
 
 import org.apache.servicecomb.foundation.common.utils.TestLambdaMetafactoryUtils.Model;
 import org.apache.servicecomb.foundation.common.utils.bean.Getter;
+import org.apache.servicecomb.foundation.common.utils.bean.IntGetter;
 
 public class TestLambdaPerformance {
   static Model model = new Model();
@@ -37,7 +38,7 @@ public class TestLambdaPerformance {
 
   static MethodHandle mh_f1_getter;
 
-  static Getter<Model, Integer> lambda_f1_method_getter;
+  static IntGetter<Model> lambda_f1_method_getter;
 
   static Field f1_field;
 
diff --git a/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/deserializer/scalar/AbstractScalarReadSchemas.java b/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/deserializer/scalar/AbstractScalarReadSchemas.java
index 89bfb0d..a1f8e06 100644
--- a/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/deserializer/scalar/AbstractScalarReadSchemas.java
+++ b/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/deserializer/scalar/AbstractScalarReadSchemas.java
@@ -32,15 +32,6 @@ public class AbstractScalarReadSchemas {
     }
   }
 
-  static abstract class AbstractIntPrimitiveSchema<T> extends FieldSchema<T> {
-    protected final Setter<T, Integer> setter;
-
-    public AbstractIntPrimitiveSchema(Field protoField, PropertyDescriptor propertyDescriptor) {
-      super(protoField, propertyDescriptor.getJavaType());
-      this.setter = propertyDescriptor.getSetter();
-    }
-  }
-
   static abstract class AbstractLongSchema<T> extends FieldSchema<T> {
     protected final Setter<T, Object> setter;
 
@@ -49,13 +40,4 @@ public class AbstractScalarReadSchemas {
       this.setter = propertyDescriptor.getSetter();
     }
   }
-
-  static abstract class AbstractLongPrimitiveSchema<T> extends FieldSchema<T> {
-    protected final Setter<T, Long> setter;
-
-    public AbstractLongPrimitiveSchema(Field protoField, PropertyDescriptor propertyDescriptor) {
-      super(protoField, propertyDescriptor.getJavaType());
-      this.setter = propertyDescriptor.getSetter();
-    }
-  }
 }
diff --git a/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/deserializer/scalar/BoolReadSchemas.java b/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/deserializer/scalar/BoolReadSchemas.java
index d543a7b..a6b1e75 100644
--- a/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/deserializer/scalar/BoolReadSchemas.java
+++ b/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/deserializer/scalar/BoolReadSchemas.java
@@ -18,6 +18,7 @@ package org.apache.servicecomb.foundation.protobuf.internal.schema.deserializer.
 
 import java.io.IOException;
 
+import org.apache.servicecomb.foundation.common.utils.bean.BoolSetter;
 import org.apache.servicecomb.foundation.common.utils.bean.Setter;
 import org.apache.servicecomb.foundation.protobuf.internal.ProtoUtils;
 import org.apache.servicecomb.foundation.protobuf.internal.bean.PropertyDescriptor;
@@ -60,7 +61,7 @@ public class BoolReadSchemas {
   }
 
   private static class BooleanPrimitiveSchema<T> extends FieldSchema<T> {
-    private final Setter<T, Boolean> setter;
+    private final BoolSetter<T> setter;
 
     public BooleanPrimitiveSchema(Field protoField, PropertyDescriptor propertyDescriptor) {
       super(protoField, propertyDescriptor.getJavaType());
diff --git a/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/deserializer/scalar/DoubleReadSchemas.java b/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/deserializer/scalar/DoubleReadSchemas.java
index 2eb5fa1..dbac060 100644
--- a/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/deserializer/scalar/DoubleReadSchemas.java
+++ b/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/deserializer/scalar/DoubleReadSchemas.java
@@ -18,6 +18,7 @@ package org.apache.servicecomb.foundation.protobuf.internal.schema.deserializer.
 
 import java.io.IOException;
 
+import org.apache.servicecomb.foundation.common.utils.bean.DoubleSetter;
 import org.apache.servicecomb.foundation.common.utils.bean.Setter;
 import org.apache.servicecomb.foundation.protobuf.internal.ProtoUtils;
 import org.apache.servicecomb.foundation.protobuf.internal.bean.PropertyDescriptor;
@@ -60,7 +61,7 @@ public class DoubleReadSchemas {
   }
 
   private static class DoublePrimitiveSchema<T> extends FieldSchema<T> {
-    private final Setter<T, Double> setter;
+    private final DoubleSetter<T> setter;
 
     public DoublePrimitiveSchema(Field protoField, PropertyDescriptor propertyDescriptor) {
       super(protoField, propertyDescriptor.getJavaType());
diff --git a/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/deserializer/scalar/EnumsReadSchemas.java b/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/deserializer/scalar/EnumsReadSchemas.java
index 2299b05..1ca9fed 100644
--- a/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/deserializer/scalar/EnumsReadSchemas.java
+++ b/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/deserializer/scalar/EnumsReadSchemas.java
@@ -18,6 +18,7 @@ package org.apache.servicecomb.foundation.protobuf.internal.schema.deserializer.
 
 import java.io.IOException;
 
+import org.apache.servicecomb.foundation.common.utils.bean.IntSetter;
 import org.apache.servicecomb.foundation.common.utils.bean.Setter;
 import org.apache.servicecomb.foundation.protobuf.internal.ProtoUtils;
 import org.apache.servicecomb.foundation.protobuf.internal.bean.PropertyDescriptor;
@@ -95,7 +96,7 @@ public class EnumsReadSchemas {
   }
 
   private static class IntPrimitiveEnumSchema<T> extends FieldSchema<T> {
-    private final Setter<T, Integer> setter;
+    private final IntSetter<T> setter;
 
     public IntPrimitiveEnumSchema(Field protoField, PropertyDescriptor propertyDescriptor) {
       super(protoField, propertyDescriptor.getJavaType());
diff --git a/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/deserializer/scalar/Fixed32ReadSchemas.java b/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/deserializer/scalar/Fixed32ReadSchemas.java
index dc88866..37a9a4b 100644
--- a/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/deserializer/scalar/Fixed32ReadSchemas.java
+++ b/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/deserializer/scalar/Fixed32ReadSchemas.java
@@ -18,9 +18,9 @@ package org.apache.servicecomb.foundation.protobuf.internal.schema.deserializer.
 
 import java.io.IOException;
 
+import org.apache.servicecomb.foundation.common.utils.bean.IntSetter;
 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.AbstractIntPrimitiveSchema;
 import org.apache.servicecomb.foundation.protobuf.internal.schema.deserializer.scalar.AbstractScalarReadSchemas.AbstractIntSchema;
 
 import com.fasterxml.jackson.databind.JavaType;
@@ -57,9 +57,12 @@ public class Fixed32ReadSchemas {
     }
   }
 
-  private static class Fixed32PrimitiveSchema<T> extends AbstractIntPrimitiveSchema<T> {
+  private static class Fixed32PrimitiveSchema<T> extends FieldSchema<T> {
+    protected final IntSetter<T> setter;
+
     public Fixed32PrimitiveSchema(Field protoField, PropertyDescriptor propertyDescriptor) {
-      super(protoField, propertyDescriptor);
+      super(protoField, propertyDescriptor.getJavaType());
+      this.setter = propertyDescriptor.getSetter();
     }
 
     @Override
diff --git a/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/deserializer/scalar/Fixed64ReadSchemas.java b/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/deserializer/scalar/Fixed64ReadSchemas.java
index bb52915..ddd1cbf 100644
--- a/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/deserializer/scalar/Fixed64ReadSchemas.java
+++ b/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/deserializer/scalar/Fixed64ReadSchemas.java
@@ -18,9 +18,9 @@ package org.apache.servicecomb.foundation.protobuf.internal.schema.deserializer.
 
 import java.io.IOException;
 
+import org.apache.servicecomb.foundation.common.utils.bean.LongSetter;
 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.AbstractLongPrimitiveSchema;
 import org.apache.servicecomb.foundation.protobuf.internal.schema.deserializer.scalar.AbstractScalarReadSchemas.AbstractLongSchema;
 
 import com.fasterxml.jackson.databind.JavaType;
@@ -57,9 +57,12 @@ public class Fixed64ReadSchemas {
     }
   }
 
-  private static class Fixed64PrimitiveSchema<T> extends AbstractLongPrimitiveSchema<T> {
+  private static class Fixed64PrimitiveSchema<T> extends FieldSchema<T> {
+    protected final LongSetter<T> setter;
+
     public Fixed64PrimitiveSchema(Field protoField, PropertyDescriptor propertyDescriptor) {
-      super(protoField, propertyDescriptor);
+      super(protoField, propertyDescriptor.getJavaType());
+      this.setter = propertyDescriptor.getSetter();
     }
 
     @Override
diff --git a/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/deserializer/scalar/FloatReadSchemas.java b/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/deserializer/scalar/FloatReadSchemas.java
index 971329d..46879c1 100644
--- a/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/deserializer/scalar/FloatReadSchemas.java
+++ b/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/deserializer/scalar/FloatReadSchemas.java
@@ -18,6 +18,7 @@ package org.apache.servicecomb.foundation.protobuf.internal.schema.deserializer.
 
 import java.io.IOException;
 
+import org.apache.servicecomb.foundation.common.utils.bean.FloatSetter;
 import org.apache.servicecomb.foundation.common.utils.bean.Setter;
 import org.apache.servicecomb.foundation.protobuf.internal.ProtoUtils;
 import org.apache.servicecomb.foundation.protobuf.internal.bean.PropertyDescriptor;
@@ -60,7 +61,7 @@ public class FloatReadSchemas {
   }
 
   private static class FloatPrimitiveSchema<T> extends FieldSchema<T> {
-    private final Setter<T, Float> setter;
+    private final FloatSetter<T> setter;
 
     public FloatPrimitiveSchema(Field protoField, PropertyDescriptor propertyDescriptor) {
       super(protoField, propertyDescriptor.getJavaType());
diff --git a/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/deserializer/scalar/Int32ReadSchemas.java b/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/deserializer/scalar/Int32ReadSchemas.java
index 2ad7f90..644102f 100644
--- a/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/deserializer/scalar/Int32ReadSchemas.java
+++ b/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/deserializer/scalar/Int32ReadSchemas.java
@@ -18,9 +18,11 @@ 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.AbstractIntPrimitiveSchema;
 import org.apache.servicecomb.foundation.protobuf.internal.schema.deserializer.scalar.AbstractScalarReadSchemas.AbstractIntSchema;
 
 import com.fasterxml.jackson.databind.JavaType;
@@ -32,9 +34,16 @@ import io.protostuff.runtime.FieldSchema;
 public class Int32ReadSchemas {
   public static <T> FieldSchema<T> create(Field protoField, PropertyDescriptor propertyDescriptor) {
     JavaType javaType = propertyDescriptor.getJavaType();
-    if (int.class.equals(javaType.getRawClass()) || byte.class.equals(javaType.getRawClass()) || short.class
-        .equals(javaType.getRawClass())) {
-      return new Int32PrimitiveSchema<>(protoField, propertyDescriptor);
+    if (int.class.equals(javaType.getRawClass())) {
+      return new IntFieldIntPrimitiveSchema<>(protoField, propertyDescriptor);
+    }
+
+    if (short.class.equals(javaType.getRawClass())) {
+      return new ShortFieldIntPrimitiveSchema<>(protoField, propertyDescriptor);
+    }
+
+    if (byte.class.equals(javaType.getRawClass())) {
+      return new ByteFieldIntPrimitiveSchema<>(protoField, propertyDescriptor);
     }
 
     if (Integer.class.equals(javaType.getRawClass()) || Byte.class.equals(javaType.getRawClass()) || Short.class
@@ -55,9 +64,9 @@ public class Int32ReadSchemas {
     @Override
     public int mergeFrom(InputEx input, T message) throws IOException {
       int value = input.readInt32();
-      if (Byte.class.equals(javaType.getRawClass()) || byte.class.equals(javaType.getRawClass())) {
+      if (Byte.class.equals(javaType.getRawClass())) {
         setter.set(message, (byte) value);
-      } else if (Short.class.equals(javaType.getRawClass()) || short.class.equals(javaType.getRawClass())) {
+      } else if (Short.class.equals(javaType.getRawClass())) {
         setter.set(message, (short) value);
       } else {
         setter.set(message, value);
@@ -66,9 +75,12 @@ public class Int32ReadSchemas {
     }
   }
 
-  private static class Int32PrimitiveSchema<T> extends AbstractIntPrimitiveSchema<T> {
-    public Int32PrimitiveSchema(Field protoField, PropertyDescriptor propertyDescriptor) {
-      super(protoField, propertyDescriptor);
+  private static class IntFieldIntPrimitiveSchema<T> extends FieldSchema<T> {
+    protected final IntSetter<T> setter;
+
+    public IntFieldIntPrimitiveSchema(Field protoField, PropertyDescriptor propertyDescriptor) {
+      super(protoField, propertyDescriptor.getJavaType());
+      this.setter = propertyDescriptor.getSetter();
     }
 
     @Override
@@ -78,4 +90,36 @@ public class Int32ReadSchemas {
       return input.readFieldNumber();
     }
   }
+
+  private static class ShortFieldIntPrimitiveSchema<T> extends FieldSchema<T> {
+    protected final ShortSetter<T> setter;
+
+    public ShortFieldIntPrimitiveSchema(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.readInt32();
+      setter.set(message, (short) value);
+      return input.readFieldNumber();
+    }
+  }
+
+  private static class ByteFieldIntPrimitiveSchema<T> extends FieldSchema<T> {
+    protected final ByteSetter<T> setter;
+
+    public ByteFieldIntPrimitiveSchema(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.readInt32();
+      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/Int64ReadSchemas.java b/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/deserializer/scalar/Int64ReadSchemas.java
index 143da29..3a73f22 100644
--- a/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/deserializer/scalar/Int64ReadSchemas.java
+++ b/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/deserializer/scalar/Int64ReadSchemas.java
@@ -20,9 +20,9 @@ import java.io.IOException;
 import java.time.LocalDate;
 import java.util.Date;
 
+import org.apache.servicecomb.foundation.common.utils.bean.LongSetter;
 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.AbstractLongPrimitiveSchema;
 import org.apache.servicecomb.foundation.protobuf.internal.schema.deserializer.scalar.AbstractScalarReadSchemas.AbstractLongSchema;
 
 import com.fasterxml.jackson.databind.JavaType;
@@ -35,7 +35,7 @@ public class Int64ReadSchemas {
   public static <T> FieldSchema<T> create(Field protoField, PropertyDescriptor propertyDescriptor) {
     JavaType javaType = propertyDescriptor.getJavaType();
     if (long.class.equals(javaType.getRawClass())) {
-      return new Int64PrimitiveSchema<>(protoField, propertyDescriptor);
+      return new LongFiledLongPrimitiveSchema<>(protoField, propertyDescriptor);
     }
 
     if (Long.class.equals(javaType.getRawClass()) || javaType.isJavaLangObject()
@@ -67,9 +67,12 @@ public class Int64ReadSchemas {
     }
   }
 
-  private static class Int64PrimitiveSchema<T> extends AbstractLongPrimitiveSchema<T> {
-    public Int64PrimitiveSchema(Field protoField, PropertyDescriptor propertyDescriptor) {
-      super(protoField, propertyDescriptor);
+  private static class LongFiledLongPrimitiveSchema<T> extends FieldSchema<T> {
+    protected final LongSetter<T> setter;
+
+    public LongFiledLongPrimitiveSchema(Field protoField, PropertyDescriptor propertyDescriptor) {
+      super(protoField, propertyDescriptor.getJavaType());
+      this.setter = propertyDescriptor.getSetter();
     }
 
     @Override
diff --git a/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/deserializer/scalar/SFixed32ReadSchemas.java b/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/deserializer/scalar/SFixed32ReadSchemas.java
index 9831032..dcd6530 100644
--- a/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/deserializer/scalar/SFixed32ReadSchemas.java
+++ b/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/deserializer/scalar/SFixed32ReadSchemas.java
@@ -18,9 +18,9 @@ package org.apache.servicecomb.foundation.protobuf.internal.schema.deserializer.
 
 import java.io.IOException;
 
+import org.apache.servicecomb.foundation.common.utils.bean.IntSetter;
 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.AbstractIntPrimitiveSchema;
 import org.apache.servicecomb.foundation.protobuf.internal.schema.deserializer.scalar.AbstractScalarReadSchemas.AbstractIntSchema;
 
 import com.fasterxml.jackson.databind.JavaType;
@@ -57,9 +57,12 @@ public class SFixed32ReadSchemas {
     }
   }
 
-  private static class SFixed32PrimitiveSchema<T> extends AbstractIntPrimitiveSchema<T> {
+  private static class SFixed32PrimitiveSchema<T> extends FieldSchema<T> {
+    protected final IntSetter<T> setter;
+
     public SFixed32PrimitiveSchema(Field protoField, PropertyDescriptor propertyDescriptor) {
-      super(protoField, propertyDescriptor);
+      super(protoField, propertyDescriptor.getJavaType());
+      this.setter = propertyDescriptor.getSetter();
     }
 
     @Override
diff --git a/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/deserializer/scalar/SFixed64ReadSchemas.java b/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/deserializer/scalar/SFixed64ReadSchemas.java
index e83a84f..f1d4f8f 100644
--- a/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/deserializer/scalar/SFixed64ReadSchemas.java
+++ b/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/deserializer/scalar/SFixed64ReadSchemas.java
@@ -18,9 +18,9 @@ package org.apache.servicecomb.foundation.protobuf.internal.schema.deserializer.
 
 import java.io.IOException;
 
+import org.apache.servicecomb.foundation.common.utils.bean.LongSetter;
 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.AbstractLongPrimitiveSchema;
 import org.apache.servicecomb.foundation.protobuf.internal.schema.deserializer.scalar.AbstractScalarReadSchemas.AbstractLongSchema;
 
 import com.fasterxml.jackson.databind.JavaType;
@@ -57,9 +57,12 @@ public class SFixed64ReadSchemas {
     }
   }
 
-  private static class SFixed64PrimitiveSchema<T> extends AbstractLongPrimitiveSchema<T> {
+  private static class SFixed64PrimitiveSchema<T> extends FieldSchema<T> {
+    protected final LongSetter<T> setter;
+
     public SFixed64PrimitiveSchema(Field protoField, PropertyDescriptor propertyDescriptor) {
-      super(protoField, propertyDescriptor);
+      super(protoField, propertyDescriptor.getJavaType());
+      this.setter = propertyDescriptor.getSetter();
     }
 
     @Override
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 ae33b4f..3662102 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,9 +18,9 @@ package org.apache.servicecomb.foundation.protobuf.internal.schema.deserializer.
 
 import java.io.IOException;
 
+import org.apache.servicecomb.foundation.common.utils.bean.IntSetter;
 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.AbstractIntPrimitiveSchema;
 import org.apache.servicecomb.foundation.protobuf.internal.schema.deserializer.scalar.AbstractScalarReadSchemas.AbstractIntSchema;
 
 import com.fasterxml.jackson.databind.JavaType;
@@ -57,9 +57,12 @@ public class SInt32ReadSchemas {
     }
   }
 
-  private static class SInt32PrimitiveSchema<T> extends AbstractIntPrimitiveSchema<T> {
+  private static class SInt32PrimitiveSchema<T> extends FieldSchema<T> {
+    protected final IntSetter<T> setter;
+
     public SInt32PrimitiveSchema(Field protoField, PropertyDescriptor propertyDescriptor) {
-      super(protoField, propertyDescriptor);
+      super(protoField, propertyDescriptor.getJavaType());
+      this.setter = propertyDescriptor.getSetter();
     }
 
     @Override
diff --git a/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/deserializer/scalar/SInt64ReadSchemas.java b/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/deserializer/scalar/SInt64ReadSchemas.java
index 850d7fe..ff3c80c 100644
--- a/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/deserializer/scalar/SInt64ReadSchemas.java
+++ b/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/deserializer/scalar/SInt64ReadSchemas.java
@@ -18,9 +18,9 @@ package org.apache.servicecomb.foundation.protobuf.internal.schema.deserializer.
 
 import java.io.IOException;
 
+import org.apache.servicecomb.foundation.common.utils.bean.LongSetter;
 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.AbstractLongPrimitiveSchema;
 import org.apache.servicecomb.foundation.protobuf.internal.schema.deserializer.scalar.AbstractScalarReadSchemas.AbstractLongSchema;
 
 import com.fasterxml.jackson.databind.JavaType;
@@ -57,9 +57,12 @@ public class SInt64ReadSchemas {
     }
   }
 
-  private static class SInt64PrimitiveSchema<T> extends AbstractLongPrimitiveSchema<T> {
+  private static class SInt64PrimitiveSchema<T> extends FieldSchema<T> {
+    protected final LongSetter<T> setter;
+
     public SInt64PrimitiveSchema(Field protoField, PropertyDescriptor propertyDescriptor) {
-      super(protoField, propertyDescriptor);
+      super(protoField, propertyDescriptor.getJavaType());
+      this.setter = propertyDescriptor.getSetter();
     }
 
     @Override
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 e2db31f..0edaa82 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
@@ -18,6 +18,7 @@ package org.apache.servicecomb.foundation.protobuf.internal.schema.deserializer.
 
 import java.io.IOException;
 
+import org.apache.servicecomb.foundation.common.utils.bean.CharSetter;
 import org.apache.servicecomb.foundation.common.utils.bean.Setter;
 import org.apache.servicecomb.foundation.protobuf.internal.ProtoUtils;
 import org.apache.servicecomb.foundation.protobuf.internal.bean.PropertyDescriptor;
@@ -31,8 +32,13 @@ import io.protostuff.runtime.FieldSchema;
 public class StringReadSchemas {
   public static <T> FieldSchema<T> create(Field protoField, PropertyDescriptor propertyDescriptor) {
     JavaType javaType = propertyDescriptor.getJavaType();
-    if (String.class.equals(javaType.getRawClass()) || javaType.isJavaLangObject() || char.class
-        .equals(javaType.getRawClass()) || Character.class.equals(javaType.getRawClass())) {
+
+    if (char.class.equals(javaType.getRawClass())) {
+      return new CharFieldStringSchema<>(protoField, propertyDescriptor);
+    }
+
+    if (String.class.equals(javaType.getRawClass()) || javaType.isJavaLangObject() || Character.class
+        .equals(javaType.getRawClass())) {
       return new StringSchema<>(protoField, propertyDescriptor);
     }
 
@@ -60,4 +66,20 @@ public class StringReadSchemas {
       return input.readFieldNumber();
     }
   }
+
+  private static class CharFieldStringSchema<T> extends FieldSchema<T> {
+    private final CharSetter<T> setter;
+
+    public CharFieldStringSchema(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, value.toCharArray()[0]);
+      return input.readFieldNumber();
+    }
+  }
 }
diff --git a/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/deserializer/scalar/UInt32ReadSchemas.java b/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/deserializer/scalar/UInt32ReadSchemas.java
index 978986b..61ef71b 100644
--- a/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/deserializer/scalar/UInt32ReadSchemas.java
+++ b/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/deserializer/scalar/UInt32ReadSchemas.java
@@ -18,9 +18,9 @@ package org.apache.servicecomb.foundation.protobuf.internal.schema.deserializer.
 
 import java.io.IOException;
 
+import org.apache.servicecomb.foundation.common.utils.bean.IntSetter;
 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.AbstractIntPrimitiveSchema;
 import org.apache.servicecomb.foundation.protobuf.internal.schema.deserializer.scalar.AbstractScalarReadSchemas.AbstractIntSchema;
 
 import com.fasterxml.jackson.databind.JavaType;
@@ -57,9 +57,12 @@ public class UInt32ReadSchemas {
     }
   }
 
-  private static class UInt32PrimitiveSchema<T> extends AbstractIntPrimitiveSchema<T> {
+  private static class UInt32PrimitiveSchema<T> extends FieldSchema<T> {
+    protected final IntSetter<T> setter;
+
     public UInt32PrimitiveSchema(Field protoField, PropertyDescriptor propertyDescriptor) {
-      super(protoField, propertyDescriptor);
+      super(protoField, propertyDescriptor.getJavaType());
+      this.setter = propertyDescriptor.getSetter();
     }
 
     @Override
diff --git a/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/deserializer/scalar/UInt64ReadSchemas.java b/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/deserializer/scalar/UInt64ReadSchemas.java
index 0e11f81..0a098a7 100644
--- a/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/deserializer/scalar/UInt64ReadSchemas.java
+++ b/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/deserializer/scalar/UInt64ReadSchemas.java
@@ -18,9 +18,9 @@ package org.apache.servicecomb.foundation.protobuf.internal.schema.deserializer.
 
 import java.io.IOException;
 
+import org.apache.servicecomb.foundation.common.utils.bean.LongSetter;
 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.AbstractLongPrimitiveSchema;
 import org.apache.servicecomb.foundation.protobuf.internal.schema.deserializer.scalar.AbstractScalarReadSchemas.AbstractLongSchema;
 
 import com.fasterxml.jackson.databind.JavaType;
@@ -57,9 +57,12 @@ public class UInt64ReadSchemas {
     }
   }
 
-  private static class UInt64PrimitiveSchema<T> extends AbstractLongPrimitiveSchema<T> {
+  private static class UInt64PrimitiveSchema<T> extends FieldSchema<T> {
+    protected final LongSetter<T> setter;
+
     public UInt64PrimitiveSchema(Field protoField, PropertyDescriptor propertyDescriptor) {
-      super(protoField, propertyDescriptor);
+      super(protoField, propertyDescriptor.getJavaType());
+      this.setter = propertyDescriptor.getSetter();
     }
 
     @Override
diff --git a/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/serializer/scalar/BoolWriteSchemas.java b/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/serializer/scalar/BoolWriteSchemas.java
index 9b5711e..6c57b6f 100644
--- a/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/serializer/scalar/BoolWriteSchemas.java
+++ b/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/serializer/scalar/BoolWriteSchemas.java
@@ -18,6 +18,7 @@ package org.apache.servicecomb.foundation.protobuf.internal.schema.serializer.sc
 
 import java.io.IOException;
 
+import org.apache.servicecomb.foundation.common.utils.bean.BoolGetter;
 import org.apache.servicecomb.foundation.common.utils.bean.Getter;
 import org.apache.servicecomb.foundation.protobuf.internal.ProtoUtils;
 import org.apache.servicecomb.foundation.protobuf.internal.bean.PropertyDescriptor;
@@ -94,7 +95,7 @@ public class BoolWriteSchemas {
   }
 
   private static class BooleanPrimitiveSchema<T> extends BooleanDynamicSchema<T> {
-    private final Getter<T, Boolean> primitiveGetter;
+    private final BoolGetter<T> primitiveGetter;
 
     public BooleanPrimitiveSchema(Field protoField, PropertyDescriptor propertyDescriptor) {
       super(protoField, propertyDescriptor);
diff --git a/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/serializer/scalar/DoubleWriteSchemas.java b/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/serializer/scalar/DoubleWriteSchemas.java
index 174ed3c..8e1c5ba 100644
--- a/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/serializer/scalar/DoubleWriteSchemas.java
+++ b/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/serializer/scalar/DoubleWriteSchemas.java
@@ -18,6 +18,7 @@ package org.apache.servicecomb.foundation.protobuf.internal.schema.serializer.sc
 
 import java.io.IOException;
 
+import org.apache.servicecomb.foundation.common.utils.bean.DoubleGetter;
 import org.apache.servicecomb.foundation.common.utils.bean.Getter;
 import org.apache.servicecomb.foundation.protobuf.internal.ProtoUtils;
 import org.apache.servicecomb.foundation.protobuf.internal.bean.PropertyDescriptor;
@@ -89,7 +90,7 @@ public class DoubleWriteSchemas {
   }
 
   private static class DoublePrimitiveSchema<T> extends DoubleDynamicSchema<T> {
-    private final Getter<T, Double> primitiveGetter;
+    private final DoubleGetter<T> primitiveGetter;
 
     public DoublePrimitiveSchema(Field protoField, PropertyDescriptor propertyDescriptor) {
       super(protoField, propertyDescriptor);
diff --git a/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/serializer/scalar/Fixed32WriteSchemas.java b/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/serializer/scalar/Fixed32WriteSchemas.java
index 546accf..cee4c90 100644
--- a/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/serializer/scalar/Fixed32WriteSchemas.java
+++ b/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/serializer/scalar/Fixed32WriteSchemas.java
@@ -19,6 +19,7 @@ package org.apache.servicecomb.foundation.protobuf.internal.schema.serializer.sc
 import java.io.IOException;
 
 import org.apache.servicecomb.foundation.common.utils.bean.Getter;
+import org.apache.servicecomb.foundation.common.utils.bean.IntGetter;
 import org.apache.servicecomb.foundation.protobuf.internal.ProtoUtils;
 import org.apache.servicecomb.foundation.protobuf.internal.bean.PropertyDescriptor;
 
@@ -89,7 +90,7 @@ public class Fixed32WriteSchemas {
   }
 
   private static class Fixed32PrimitiveSchema<T> extends Fixed32DynamicSchema<T> {
-    private final Getter<T, Integer> primitiveGetter;
+    private final IntGetter<T> primitiveGetter;
 
     public Fixed32PrimitiveSchema(Field protoField, PropertyDescriptor propertyDescriptor) {
       super(protoField, propertyDescriptor);
diff --git a/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/serializer/scalar/Fixed64WriteSchemas.java b/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/serializer/scalar/Fixed64WriteSchemas.java
index f4fad8b..22d982b 100644
--- a/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/serializer/scalar/Fixed64WriteSchemas.java
+++ b/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/serializer/scalar/Fixed64WriteSchemas.java
@@ -19,6 +19,7 @@ package org.apache.servicecomb.foundation.protobuf.internal.schema.serializer.sc
 import java.io.IOException;
 
 import org.apache.servicecomb.foundation.common.utils.bean.Getter;
+import org.apache.servicecomb.foundation.common.utils.bean.LongGetter;
 import org.apache.servicecomb.foundation.protobuf.internal.ProtoUtils;
 import org.apache.servicecomb.foundation.protobuf.internal.bean.PropertyDescriptor;
 
@@ -89,7 +90,7 @@ public class Fixed64WriteSchemas {
   }
 
   private static class Fixed64PrimitiveSchema<T> extends Fixed64DynamicSchema<T> {
-    private final Getter<T, Long> primitiveGetter;
+    private final LongGetter<T> primitiveGetter;
 
     public Fixed64PrimitiveSchema(Field protoField, PropertyDescriptor propertyDescriptor) {
       super(protoField, propertyDescriptor);
diff --git a/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/serializer/scalar/FloatWriteSchemas.java b/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/serializer/scalar/FloatWriteSchemas.java
index c721b9b..b9e4105 100644
--- a/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/serializer/scalar/FloatWriteSchemas.java
+++ b/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/serializer/scalar/FloatWriteSchemas.java
@@ -18,6 +18,7 @@ package org.apache.servicecomb.foundation.protobuf.internal.schema.serializer.sc
 
 import java.io.IOException;
 
+import org.apache.servicecomb.foundation.common.utils.bean.FloatGetter;
 import org.apache.servicecomb.foundation.common.utils.bean.Getter;
 import org.apache.servicecomb.foundation.protobuf.internal.ProtoUtils;
 import org.apache.servicecomb.foundation.protobuf.internal.bean.PropertyDescriptor;
@@ -89,7 +90,7 @@ public class FloatWriteSchemas {
   }
 
   private static class FloatPrimitiveSchema<T> extends FloatDynamicSchema<T> {
-    private final Getter<T, Float> primitiveGetter;
+    private final FloatGetter<T> primitiveGetter;
 
     public FloatPrimitiveSchema(Field protoField, PropertyDescriptor propertyDescriptor) {
       super(protoField, propertyDescriptor);
diff --git a/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/serializer/scalar/Int32WriteSchemas.java b/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/serializer/scalar/Int32WriteSchemas.java
index 8d202d6..724321b 100644
--- a/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/serializer/scalar/Int32WriteSchemas.java
+++ b/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/serializer/scalar/Int32WriteSchemas.java
@@ -18,7 +18,10 @@ package org.apache.servicecomb.foundation.protobuf.internal.schema.serializer.sc
 
 import java.io.IOException;
 
+import org.apache.servicecomb.foundation.common.utils.bean.ByteGetter;
 import org.apache.servicecomb.foundation.common.utils.bean.Getter;
+import org.apache.servicecomb.foundation.common.utils.bean.IntGetter;
+import org.apache.servicecomb.foundation.common.utils.bean.ShortGetter;
 import org.apache.servicecomb.foundation.protobuf.internal.ProtoUtils;
 import org.apache.servicecomb.foundation.protobuf.internal.bean.PropertyDescriptor;
 
@@ -29,11 +32,15 @@ import io.protostuff.runtime.FieldSchema;
 public final class Int32WriteSchemas {
   public static <T> FieldSchema<T> create(Field protoField, PropertyDescriptor propertyDescriptor) {
     if (int.class.equals(propertyDescriptor.getJavaType().getRawClass())) {
-      return new Int32PrimitiveSchema<>(protoField, propertyDescriptor);
+      return new IntFieldInt32PrimitiveSchema<>(protoField, propertyDescriptor);
     }
 
-    if (Integer.class.equals(propertyDescriptor.getJavaType().getRawClass())) {
-      return new Int32Schema<>(protoField, propertyDescriptor);
+    if (short.class.equals(propertyDescriptor.getJavaType().getRawClass())) {
+      return new ShortFieldInt32PrimitiveSchema<>(protoField, propertyDescriptor);
+    }
+
+    if (byte.class.equals(propertyDescriptor.getJavaType().getRawClass())) {
+      return new ByteFieldInt32PrimitiveSchema<>(protoField, propertyDescriptor);
     }
 
     return new Int32Schema<>(protoField, propertyDescriptor);
@@ -91,10 +98,10 @@ public final class Int32WriteSchemas {
     }
   }
 
-  private static final class Int32PrimitiveSchema<T> extends Int32DynamicSchema<T> {
-    private final Getter<T, Integer> primitiveGetter;
+  private static final class IntFieldInt32PrimitiveSchema<T> extends Int32DynamicSchema<T> {
+    private final IntGetter<T> primitiveGetter;
 
-    public Int32PrimitiveSchema(Field protoField, PropertyDescriptor propertyDescriptor) {
+    public IntFieldInt32PrimitiveSchema(Field protoField, PropertyDescriptor propertyDescriptor) {
       super(protoField, propertyDescriptor);
 
       primitiveGetter = propertyDescriptor.getGetter();
@@ -106,4 +113,36 @@ public final class Int32WriteSchemas {
       output.writeScalarInt32(tag, tagSize, value);
     }
   }
+
+  private static final class ShortFieldInt32PrimitiveSchema<T> extends Int32DynamicSchema<T> {
+    private final ShortGetter<T> primitiveGetter;
+
+    public ShortFieldInt32PrimitiveSchema(Field protoField, PropertyDescriptor propertyDescriptor) {
+      super(protoField, propertyDescriptor);
+
+      primitiveGetter = propertyDescriptor.getGetter();
+    }
+
+    @Override
+    public final void getAndWriteTo(OutputEx output, T message) throws IOException {
+      short value = primitiveGetter.get(message);
+      output.writeScalarInt32(tag, tagSize, value);
+    }
+  }
+
+  private static final class ByteFieldInt32PrimitiveSchema<T> extends Int32DynamicSchema<T> {
+    private final ByteGetter<T> primitiveGetter;
+
+    public ByteFieldInt32PrimitiveSchema(Field protoField, PropertyDescriptor propertyDescriptor) {
+      super(protoField, propertyDescriptor);
+
+      primitiveGetter = propertyDescriptor.getGetter();
+    }
+
+    @Override
+    public final void getAndWriteTo(OutputEx output, T message) throws IOException {
+      byte value = primitiveGetter.get(message);
+      output.writeScalarInt32(tag, tagSize, value);
+    }
+  }
 }
diff --git a/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/serializer/scalar/Int64WriteSchemas.java b/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/serializer/scalar/Int64WriteSchemas.java
index 1856229..ed72737 100644
--- a/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/serializer/scalar/Int64WriteSchemas.java
+++ b/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/serializer/scalar/Int64WriteSchemas.java
@@ -22,6 +22,7 @@ import java.time.temporal.ChronoField;
 import java.util.Date;
 
 import org.apache.servicecomb.foundation.common.utils.bean.Getter;
+import org.apache.servicecomb.foundation.common.utils.bean.LongGetter;
 import org.apache.servicecomb.foundation.protobuf.internal.ProtoUtils;
 import org.apache.servicecomb.foundation.protobuf.internal.bean.PropertyDescriptor;
 
@@ -104,7 +105,7 @@ public class Int64WriteSchemas {
   }
 
   private static final class Int64PrimitiveSchema<T> extends Int64DynamicSchema<T> {
-    private final Getter<T, Long> primitiveGetter;
+    private final LongGetter<T> primitiveGetter;
 
     public Int64PrimitiveSchema(Field protoField, PropertyDescriptor propertyDescriptor) {
       super(protoField, propertyDescriptor);
diff --git a/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/serializer/scalar/SFixed32WriteSchemas.java b/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/serializer/scalar/SFixed32WriteSchemas.java
index fe4fddc..3cbbd8c 100644
--- a/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/serializer/scalar/SFixed32WriteSchemas.java
+++ b/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/serializer/scalar/SFixed32WriteSchemas.java
@@ -19,6 +19,7 @@ package org.apache.servicecomb.foundation.protobuf.internal.schema.serializer.sc
 import java.io.IOException;
 
 import org.apache.servicecomb.foundation.common.utils.bean.Getter;
+import org.apache.servicecomb.foundation.common.utils.bean.IntGetter;
 import org.apache.servicecomb.foundation.protobuf.internal.ProtoUtils;
 import org.apache.servicecomb.foundation.protobuf.internal.bean.PropertyDescriptor;
 
@@ -89,7 +90,7 @@ public class SFixed32WriteSchemas {
   }
 
   private static class SFixed32PrimitiveSchema<T> extends SFixed32DynamicSchema<T> {
-    private final Getter<T, Integer> primitiveGetter;
+    private final IntGetter<T> primitiveGetter;
 
     public SFixed32PrimitiveSchema(Field protoField, PropertyDescriptor propertyDescriptor) {
       super(protoField, propertyDescriptor);
diff --git a/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/serializer/scalar/SFixed64WriteSchemas.java b/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/serializer/scalar/SFixed64WriteSchemas.java
index 4f1432e..2f0a4be 100644
--- a/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/serializer/scalar/SFixed64WriteSchemas.java
+++ b/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/serializer/scalar/SFixed64WriteSchemas.java
@@ -19,6 +19,7 @@ package org.apache.servicecomb.foundation.protobuf.internal.schema.serializer.sc
 import java.io.IOException;
 
 import org.apache.servicecomb.foundation.common.utils.bean.Getter;
+import org.apache.servicecomb.foundation.common.utils.bean.LongGetter;
 import org.apache.servicecomb.foundation.protobuf.internal.ProtoUtils;
 import org.apache.servicecomb.foundation.protobuf.internal.bean.PropertyDescriptor;
 
@@ -89,7 +90,7 @@ public class SFixed64WriteSchemas {
   }
 
   private static class SFixed64PrimitiveSchema<T> extends SFixed64DynamicSchema<T> {
-    private final Getter<T, Long> primitiveGetter;
+    private final LongGetter<T> primitiveGetter;
 
     public SFixed64PrimitiveSchema(Field protoField, PropertyDescriptor propertyDescriptor) {
       super(protoField, propertyDescriptor);
diff --git a/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/serializer/scalar/SInt32WriteSchemas.java b/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/serializer/scalar/SInt32WriteSchemas.java
index 18d5413..f3d2e1a 100644
--- a/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/serializer/scalar/SInt32WriteSchemas.java
+++ b/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/serializer/scalar/SInt32WriteSchemas.java
@@ -19,6 +19,7 @@ package org.apache.servicecomb.foundation.protobuf.internal.schema.serializer.sc
 import java.io.IOException;
 
 import org.apache.servicecomb.foundation.common.utils.bean.Getter;
+import org.apache.servicecomb.foundation.common.utils.bean.IntGetter;
 import org.apache.servicecomb.foundation.protobuf.internal.ProtoUtils;
 import org.apache.servicecomb.foundation.protobuf.internal.bean.PropertyDescriptor;
 
@@ -89,7 +90,7 @@ public class SInt32WriteSchemas {
   }
 
   private static class SInt32PrimitiveSchema<T> extends SInt32DynamicSchema<T> {
-    private final Getter<T, Integer> primitiveGetter;
+    private final IntGetter<T> primitiveGetter;
 
     public SInt32PrimitiveSchema(Field protoField, PropertyDescriptor propertyDescriptor) {
       super(protoField, propertyDescriptor);
diff --git a/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/serializer/scalar/SInt64WriteSchemas.java b/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/serializer/scalar/SInt64WriteSchemas.java
index f085b2c..b935e26 100644
--- a/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/serializer/scalar/SInt64WriteSchemas.java
+++ b/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/serializer/scalar/SInt64WriteSchemas.java
@@ -19,6 +19,7 @@ package org.apache.servicecomb.foundation.protobuf.internal.schema.serializer.sc
 import java.io.IOException;
 
 import org.apache.servicecomb.foundation.common.utils.bean.Getter;
+import org.apache.servicecomb.foundation.common.utils.bean.LongGetter;
 import org.apache.servicecomb.foundation.protobuf.internal.ProtoUtils;
 import org.apache.servicecomb.foundation.protobuf.internal.bean.PropertyDescriptor;
 
@@ -89,7 +90,7 @@ public class SInt64WriteSchemas {
   }
 
   private static class SInt64PrimitiveSchema<T> extends SInt64DynamicSchema<T> {
-    private final Getter<T, Long> primitiveGetter;
+    private final LongGetter<T> primitiveGetter;
 
     public SInt64PrimitiveSchema(Field protoField, PropertyDescriptor propertyDescriptor) {
       super(protoField, propertyDescriptor);
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 18051d6..34c8647 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
@@ -18,6 +18,7 @@ package org.apache.servicecomb.foundation.protobuf.internal.schema.serializer.sc
 
 import java.io.IOException;
 
+import org.apache.servicecomb.foundation.common.utils.bean.CharGetter;
 import org.apache.servicecomb.foundation.common.utils.bean.Getter;
 import org.apache.servicecomb.foundation.protobuf.internal.ProtoUtils;
 import org.apache.servicecomb.foundation.protobuf.internal.bean.PropertyDescriptor;
@@ -28,6 +29,10 @@ import io.protostuff.runtime.FieldSchema;
 
 public class StringWriteSchemas {
   public static <T> FieldSchema<T> create(Field protoField, PropertyDescriptor propertyDescriptor) {
+    if (char.class.equals(propertyDescriptor.getJavaType().getRawClass())) {
+      return new CharFieldStringSchema<>(protoField, propertyDescriptor);
+    }
+
     if (String.class.equals(propertyDescriptor.getJavaType().getRawClass())) {
       return new StringSchema<>(protoField, propertyDescriptor);
     }
@@ -56,7 +61,7 @@ public class StringWriteSchemas {
       }
 
       if (value instanceof Character) {
-        output.writeScalarString(tag, tagSize, String.valueOf((char)value));
+        output.writeScalarString(tag, tagSize, String.valueOf((char) value));
         return;
       }
 
@@ -81,4 +86,20 @@ public class StringWriteSchemas {
       }
     }
   }
+
+  private static class CharFieldStringSchema<T> extends StringDynamicSchema<T> {
+    protected final CharGetter<T> getter;
+
+    public CharFieldStringSchema(Field protoField, PropertyDescriptor propertyDescriptor) {
+      super(protoField, propertyDescriptor);
+
+      this.getter = propertyDescriptor.getGetter();
+    }
+
+    @Override
+    public final void getAndWriteTo(OutputEx output, T message) throws IOException {
+      char value = getter.get(message);
+      writeTo(output, value);
+    }
+  }
 }
diff --git a/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/serializer/scalar/UInt32WriteSchemas.java b/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/serializer/scalar/UInt32WriteSchemas.java
index 9a47705..6a163be 100644
--- a/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/serializer/scalar/UInt32WriteSchemas.java
+++ b/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/serializer/scalar/UInt32WriteSchemas.java
@@ -19,6 +19,7 @@ package org.apache.servicecomb.foundation.protobuf.internal.schema.serializer.sc
 import java.io.IOException;
 
 import org.apache.servicecomb.foundation.common.utils.bean.Getter;
+import org.apache.servicecomb.foundation.common.utils.bean.IntGetter;
 import org.apache.servicecomb.foundation.protobuf.internal.ProtoUtils;
 import org.apache.servicecomb.foundation.protobuf.internal.bean.PropertyDescriptor;
 
@@ -89,7 +90,7 @@ public class UInt32WriteSchemas {
   }
 
   private static class UInt32PrimitiveSchema<T> extends UInt32DynamicSchema<T> {
-    private final Getter<T, Integer> primitiveGetter;
+    private final IntGetter<T> primitiveGetter;
 
     public UInt32PrimitiveSchema(Field protoField, PropertyDescriptor propertyDescriptor) {
       super(protoField, propertyDescriptor);
diff --git a/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/serializer/scalar/UInt64WriteSchemas.java b/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/serializer/scalar/UInt64WriteSchemas.java
index c6ec795..e8a449f 100644
--- a/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/serializer/scalar/UInt64WriteSchemas.java
+++ b/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/serializer/scalar/UInt64WriteSchemas.java
@@ -19,6 +19,7 @@ package org.apache.servicecomb.foundation.protobuf.internal.schema.serializer.sc
 import java.io.IOException;
 
 import org.apache.servicecomb.foundation.common.utils.bean.Getter;
+import org.apache.servicecomb.foundation.common.utils.bean.LongGetter;
 import org.apache.servicecomb.foundation.protobuf.internal.ProtoUtils;
 import org.apache.servicecomb.foundation.protobuf.internal.bean.PropertyDescriptor;
 
@@ -89,7 +90,7 @@ public class UInt64WriteSchemas {
   }
 
   private static class UInt64PrimitiveSchema<T> extends UInt64DynamicSchema<T> {
-    private final Getter<T, Long> primitiveGetter;
+    private final LongGetter<T> primitiveGetter;
 
     public UInt64PrimitiveSchema(Field protoField, PropertyDescriptor propertyDescriptor) {
       super(protoField, propertyDescriptor);
diff --git a/foundations/foundation-protobuf/src/test/java/org/apache/servicecomb/foundation/protobuf/internal/bean/TestBeanDescriptorManager.java b/foundations/foundation-protobuf/src/test/java/org/apache/servicecomb/foundation/protobuf/internal/bean/TestBeanDescriptorManager.java
index bdbb714..9d2994b 100644
--- a/foundations/foundation-protobuf/src/test/java/org/apache/servicecomb/foundation/protobuf/internal/bean/TestBeanDescriptorManager.java
+++ b/foundations/foundation-protobuf/src/test/java/org/apache/servicecomb/foundation/protobuf/internal/bean/TestBeanDescriptorManager.java
@@ -20,6 +20,8 @@ import java.lang.reflect.Method;
 
 import org.apache.servicecomb.foundation.common.utils.ReflectUtils;
 import org.apache.servicecomb.foundation.common.utils.bean.Getter;
+import org.apache.servicecomb.foundation.common.utils.bean.IntGetter;
+import org.apache.servicecomb.foundation.common.utils.bean.IntSetter;
 import org.apache.servicecomb.foundation.common.utils.bean.Setter;
 import org.junit.Assert;
 import org.junit.Test;
@@ -106,8 +108,8 @@ public class TestBeanDescriptorManager {
   @Test
   public void both() {
     PropertyDescriptor propertyDescriptor = beanDescriptor.getPropertyDescriptors().get("both");
-    ((Setter<Model, Integer>) propertyDescriptor.getSetter()).set(model, 1);
-    Assert.assertEquals(1, ((Getter<Model, Integer>) propertyDescriptor.getGetter()).get(model).intValue());
+    ((IntSetter<Model>) propertyDescriptor.getSetter()).set(model, 1);
+    Assert.assertEquals(1, ((IntGetter<Model>) propertyDescriptor.getGetter()).get(model));
     Assert.assertEquals(1, model.getBoth());
   }
 
@@ -118,7 +120,7 @@ public class TestBeanDescriptorManager {
     Assert.assertNull(propertyDescriptor.getSetter());
 
     model.onlyGet(1);
-    Assert.assertEquals(1, ((Getter<Model, Integer>) propertyDescriptor.getGetter()).get(model).intValue());
+    Assert.assertEquals(1, ((IntGetter<Model>) propertyDescriptor.getGetter()).get(model));
     Assert.assertEquals(1, model.getOnlyGet());
   }
 
@@ -128,7 +130,7 @@ public class TestBeanDescriptorManager {
     PropertyDescriptor propertyDescriptor = beanDescriptor.getPropertyDescriptors().get("onlySet");
     Assert.assertNull(propertyDescriptor.getGetter());
 
-    ((Setter<Model, Integer>) propertyDescriptor.getSetter()).set(model, 1);
+    ((IntSetter<Model>) propertyDescriptor.getSetter()).set(model, 1);
     Assert.assertEquals(1, model.onlySet());
   }
 
diff --git a/integration-tests/it-common/src/main/java/org/apache/servicecomb/it/schema/objectparams/FlattenObjectRequest.java b/integration-tests/it-common/src/main/java/org/apache/servicecomb/it/schema/objectparams/FlattenObjectRequest.java
index 21b7b9f..b0b134f 100644
--- a/integration-tests/it-common/src/main/java/org/apache/servicecomb/it/schema/objectparams/FlattenObjectRequest.java
+++ b/integration-tests/it-common/src/main/java/org/apache/servicecomb/it/schema/objectparams/FlattenObjectRequest.java
@@ -261,4 +261,27 @@ public class FlattenObjectRequest {
             anWrappedInteger,
             anWrappedLong, anWrappedFloat, anWrappedDouble, anWrappedBoolean, anWrappedCharacter, string, color);
   }
+
+  public static FlattenObjectRequest createFlattenObjectRequest() {
+    FlattenObjectRequest request = new FlattenObjectRequest();
+    request.setAnByte((byte) 8);
+    request.setAnShort((short) 7);
+    request.setAnInt(6);
+    request.setAnLong(5);
+    request.setAnFloat(4.4f);
+    request.setAnDouble(3.3);
+    request.setAnBoolean(true);
+    request.setAnChar('c');
+    request.setAnWrappedByte((byte) 16);
+    request.setAnWrappedShort((short) 15);
+    request.setAnWrappedInteger(14);
+    request.setAnWrappedLong(13L);
+    request.setAnWrappedFloat(12.2f);
+    request.setAnWrappedDouble(11.1);
+    request.setAnWrappedBoolean(true);
+    request.setAnWrappedCharacter('d');
+    request.setString("abc");
+    request.setColor(Color.BLUE);
+    return request;
+  }
 }
\ No newline at end of file
diff --git a/integration-tests/it-consumer/src/main/java/org/apache/servicecomb/it/testcase/objectparams/TestSpringMVCObjectParamType.java b/integration-tests/it-consumer/src/main/java/org/apache/servicecomb/it/testcase/objectparams/TestSpringMVCObjectParamType.java
index bbb7707..693e4af 100644
--- a/integration-tests/it-consumer/src/main/java/org/apache/servicecomb/it/testcase/objectparams/TestSpringMVCObjectParamType.java
+++ b/integration-tests/it-consumer/src/main/java/org/apache/servicecomb/it/testcase/objectparams/TestSpringMVCObjectParamType.java
@@ -58,7 +58,7 @@ public class TestSpringMVCObjectParamType {
 
   @Test
   public void testFlattenObjectParam_rpc() {
-    FlattenObjectRequest request = createFlattenObjectRequest();
+    FlattenObjectRequest request = FlattenObjectRequest.createFlattenObjectRequest();
     FlattenObjectResponse response = consumers.getIntf().testFlattenObjectParam(request);
     Assert.assertEquals(Json.encode(request), Json.encode(response));
 
@@ -69,7 +69,7 @@ public class TestSpringMVCObjectParamType {
 
   @Test
   public void testFlattenObjectParam_rt() {
-    FlattenObjectRequest request = createFlattenObjectRequest();
+    FlattenObjectRequest request = FlattenObjectRequest.createFlattenObjectRequest();
     FlattenObjectResponse response = consumers.getSCBRestTemplate()
         .postForObject("/testFlattenObjectParam", request, FlattenObjectResponse.class);
     Assert.assertEquals(Json.encode(request), Json.encode(response));
@@ -82,7 +82,7 @@ public class TestSpringMVCObjectParamType {
 
   @Test
   public void testFlattenObjectParam_edge() {
-    FlattenObjectRequest request = createFlattenObjectRequest();
+    FlattenObjectRequest request = FlattenObjectRequest.createFlattenObjectRequest();
     FlattenObjectResponse response = consumers.getEdgeRestTemplate()
         .postForObject("/testFlattenObjectParam", request, FlattenObjectResponse.class);
     Assert.assertEquals(Json.encode(request), Json.encode(response));
@@ -98,7 +98,7 @@ public class TestSpringMVCObjectParamType {
   @Test
   public void testMultiLayerObjectParam_rpc() {
     MultiLayerObjectParam request = new MultiLayerObjectParam("sss-1", new Date(),
-        new MultiLayerObjectParam2("sss-2", 12.12, createFlattenObjectRequest()));
+        new MultiLayerObjectParam2("sss-2", 12.12, FlattenObjectRequest.createFlattenObjectRequest()));
     MultiLayerObjectParam response = consumers.getIntf().testMultiLayerObjectParam(request);
     Assert.assertEquals(request, response);
 //  Highway will not give null return value
@@ -109,7 +109,7 @@ public class TestSpringMVCObjectParamType {
   @Test
   public void testMultiLayerObjectParam_rt() {
     MultiLayerObjectParam request = new MultiLayerObjectParam("sss-1", new Date(),
-        new MultiLayerObjectParam2("sss-2", 12.12, createFlattenObjectRequest()));
+        new MultiLayerObjectParam2("sss-2", 12.12, FlattenObjectRequest.createFlattenObjectRequest()));
     ResponseEntity<MultiLayerObjectParam> responseEntity = consumers.getSCBRestTemplate()
         .exchange("/testMultiLayerObjectParam", HttpMethod.PUT,
             new HttpEntity<>(request), MultiLayerObjectParam.class);
@@ -127,7 +127,7 @@ public class TestSpringMVCObjectParamType {
   @Test
   public void testMultiLayerObjectParam_edge() {
     MultiLayerObjectParam request = new MultiLayerObjectParam("sss-1", new Date(),
-        new MultiLayerObjectParam2("sss-2", 12.12, createFlattenObjectRequest()));
+        new MultiLayerObjectParam2("sss-2", 12.12, FlattenObjectRequest.createFlattenObjectRequest()));
     ResponseEntity<MultiLayerObjectParam> responseEntity = consumers.getEdgeRestTemplate()
         .exchange("/testMultiLayerObjectParam", HttpMethod.PUT,
             new HttpEntity<>(request), MultiLayerObjectParam.class);
@@ -311,7 +311,7 @@ public class TestSpringMVCObjectParamType {
 
   @Test
   public void testQueryObjectParam() {
-    FlattenObjectRequest expected = createFlattenObjectRequest();
+    FlattenObjectRequest expected = FlattenObjectRequest.createFlattenObjectRequest();
     FlattenObjectRequest response = consumers.getIntf().testQueryObjectParam(
         expected.getAnByte(), expected.getAnShort(), expected.getAnInt(), expected.getAnLong(), expected.getAnFloat(),
         expected.getAnDouble(), expected.isAnBoolean(), expected.getAnChar(),
@@ -367,29 +367,6 @@ public class TestSpringMVCObjectParamType {
     Assert.assertEquals(expected, response);
   }
 
-  private FlattenObjectRequest createFlattenObjectRequest() {
-    FlattenObjectRequest request = new FlattenObjectRequest();
-    request.setAnByte((byte) 8);
-    request.setAnShort((short) 7);
-    request.setAnInt(6);
-    request.setAnLong(5);
-    request.setAnFloat(4.4f);
-    request.setAnDouble(3.3);
-    request.setAnBoolean(true);
-    request.setAnChar('c');
-    request.setAnWrappedByte((byte) 16);
-    request.setAnWrappedShort((short) 15);
-    request.setAnWrappedInteger(14);
-    request.setAnWrappedLong(13L);
-    request.setAnWrappedFloat(12.2f);
-    request.setAnWrappedDouble(11.1);
-    request.setAnWrappedBoolean(true);
-    request.setAnWrappedCharacter('d');
-    request.setString("abc");
-    request.setColor(Color.BLUE);
-    return request;
-  }
-
   private RecursiveObjectParam createRecursiveObjectParam() {
     return new RecursiveObjectParam(new InnerRecursiveObjectParam(1, "sss1",
         new RecursiveObjectParam(new InnerRecursiveObjectParam(2, "sss2", new RecursiveObjectParam()),