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 2021/09/25 15:37:37 UTC

[servicecomb-java-chassis] branch master updated: [SCB-2343]fix highway empty string serialization problem (#2597)

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 3286fa4  [SCB-2343]fix highway empty string serialization problem (#2597)
3286fa4 is described below

commit 3286fa4e6235b14809b62e35becb1cbb49ca260d
Author: liubao68 <bi...@qq.com>
AuthorDate: Sat Sep 25 23:37:32 2021 +0800

    [SCB-2343]fix highway empty string serialization problem (#2597)
---
 .../demo/pojo/client/CodeFirstPojoClient.java      | 30 +++++++++
 .../servicecomb/demo/pojo/client/PojoClient.java   |  2 +-
 .../demo/pojo/server/CodeFirstPojo.java            | 39 ++++++++++++
 .../apache/servicecomb/demo/CodeFirstPojoIntf.java |  4 ++
 .../ParseRequest.java}                             | 53 +++++++++-------
 .../servicecomb/demo/mapnull/ParseResponse.java    | 72 ++++++++++++++++++++++
 .../client/CodeFirstRestTemplateSpringmvc.java     | 12 +++-
 .../main/java/io/protostuff/ProtobufOutputEx.java  |  4 +-
 .../demo/pojo/test/endpoints/CodeFirstPojo.java    |  7 +++
 9 files changed, 194 insertions(+), 29 deletions(-)

diff --git a/demo/demo-pojo/pojo-client/src/main/java/org/apache/servicecomb/demo/pojo/client/CodeFirstPojoClient.java b/demo/demo-pojo/pojo-client/src/main/java/org/apache/servicecomb/demo/pojo/client/CodeFirstPojoClient.java
index 375561f..dbc1bc2 100644
--- a/demo/demo-pojo/pojo-client/src/main/java/org/apache/servicecomb/demo/pojo/client/CodeFirstPojoClient.java
+++ b/demo/demo-pojo/pojo-client/src/main/java/org/apache/servicecomb/demo/pojo/client/CodeFirstPojoClient.java
@@ -30,6 +30,8 @@ import org.apache.servicecomb.demo.CategorizedTestCase;
 import org.apache.servicecomb.demo.CodeFirstPojoIntf;
 import org.apache.servicecomb.demo.TestMgr;
 import org.apache.servicecomb.demo.compute.Person;
+import org.apache.servicecomb.demo.mapnull.ParseRequest;
+import org.apache.servicecomb.demo.mapnull.ParseResponse;
 import org.apache.servicecomb.demo.server.MapModel;
 import org.apache.servicecomb.demo.server.User;
 import org.apache.servicecomb.foundation.vertx.VertxUtils;
@@ -68,6 +70,7 @@ public class CodeFirstPojoClient implements CategorizedTestCase {
   }
 
   private void testAll(CodeFirstPojoIntf codeFirst) {
+    remoteCodeFirstPojo_testParseResponse(codeFirst);
     remoteCodeFirstPojo_testMapModel(codeFirst);
     remoteCodeFirstPojo_testMap(codeFirst);
     testCodeFirstUserMap(codeFirst);
@@ -123,6 +126,12 @@ public class CodeFirstPojoClient implements CategorizedTestCase {
     }
   }
 
+  private void remoteCodeFirstPojo_testParseResponse(CodeFirstPojoIntf codeFirst) {
+    ParseResponse r = codeFirst.parse(new ParseRequest());
+    TestMgr.check("", r.getMsgHeader().get("K16"));
+    TestMgr.check("CMT", r.getMsgHeader().get("K14"));
+  }
+
   private void remoteCodeFirstPojo_testMapModel(CodeFirstPojoIntf codeFirst) {
     MapModel model = new MapModel();
     model.setName("hello");
@@ -147,6 +156,18 @@ public class CodeFirstPojoClient implements CategorizedTestCase {
     TestMgr.check(result.getName(), null);
     TestMgr.check(result.getNames().get("u1"), "u1");
     TestMgr.check(result.getNames().get("u2"), null);
+
+    model = new MapModel();
+    model.setName(null);
+    userMap = new HashMap<>();
+    userMap.put("u1", "u1");
+    userMap.put("u2", "");
+    model.setNames(userMap);
+    result = codeFirst.testMapModel(model);
+
+    TestMgr.check(result.getName(), null);
+    TestMgr.check(result.getNames().get("u1"), "u1");
+    TestMgr.check(result.getNames().get("u2"), "");
   }
 
   private void remoteCodeFirstPojo_testMap(CodeFirstPojoIntf codeFirst) {
@@ -227,6 +248,10 @@ public class CodeFirstPojoClient implements CategorizedTestCase {
     String[] result = codeFirst.testStrings(new String[] {"a", "b"});
     TestMgr.check("aa0", result[0]);
     TestMgr.check("b", result[1]);
+
+    result = codeFirst.testStrings(new String[] {"a", ""});
+    TestMgr.check("aa0", result[0]);
+    TestMgr.check("", result[1]);
   }
 
   private void testCodeFirstBytes(CodeFirstPojoIntf codeFirst) {
@@ -284,6 +309,11 @@ public class CodeFirstPojoClient implements CategorizedTestCase {
 
     Person result = codeFirst.sayHello(input);
     TestMgr.check("hello person name", result.getName());
+
+    input.setName("");
+
+    result = codeFirst.sayHello(input);
+    TestMgr.check("hello ", result.getName());
   }
 
   private void testCodeFirstReduce(CodeFirstPojoIntf codeFirst) {
diff --git a/demo/demo-pojo/pojo-client/src/main/java/org/apache/servicecomb/demo/pojo/client/PojoClient.java b/demo/demo-pojo/pojo-client/src/main/java/org/apache/servicecomb/demo/pojo/client/PojoClient.java
index 84dd27f..3b69ad0 100644
--- a/demo/demo-pojo/pojo-client/src/main/java/org/apache/servicecomb/demo/pojo/client/PojoClient.java
+++ b/demo/demo-pojo/pojo-client/src/main/java/org/apache/servicecomb/demo/pojo/client/PojoClient.java
@@ -294,7 +294,7 @@ public class PojoClient {
   }
 
   private static void testEmptyHighway(Test test) {
-    TestMgr.check("code is 'null'", test.getTestString(""));
+    TestMgr.check("code is ''", test.getTestString(""));
   }
 
   private static void testEmptyRest(Test test) {
diff --git a/demo/demo-pojo/pojo-server/src/main/java/org/apache/servicecomb/demo/pojo/server/CodeFirstPojo.java b/demo/demo-pojo/pojo-server/src/main/java/org/apache/servicecomb/demo/pojo/server/CodeFirstPojo.java
index b4653b5..0beb9e6 100644
--- a/demo/demo-pojo/pojo-server/src/main/java/org/apache/servicecomb/demo/pojo/server/CodeFirstPojo.java
+++ b/demo/demo-pojo/pojo-server/src/main/java/org/apache/servicecomb/demo/pojo/server/CodeFirstPojo.java
@@ -18,12 +18,15 @@
 package org.apache.servicecomb.demo.pojo.server;
 
 import java.util.Date;
+import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.concurrent.CompletableFuture;
 
 import org.apache.servicecomb.demo.CodeFirstPojoIntf;
 import org.apache.servicecomb.demo.compute.Person;
+import org.apache.servicecomb.demo.mapnull.ParseRequest;
+import org.apache.servicecomb.demo.mapnull.ParseResponse;
 import org.apache.servicecomb.demo.server.MapModel;
 import org.apache.servicecomb.demo.server.User;
 import org.apache.servicecomb.provider.pojo.RpcSchema;
@@ -36,6 +39,42 @@ import io.swagger.annotations.SwaggerDefinition;
 @SwaggerDefinition(basePath = "/pojo/rest")
 public class CodeFirstPojo implements CodeFirstPojoIntf {
   @Override
+  public ParseResponse parse(ParseRequest request) {
+    ParseResponse r = new ParseResponse();
+    r.setResultCode("CU1I0000");
+    r.setResultInfo("报文处理成功!报文解析成功!");
+    r.setMsgType("cncc.111.001.01");
+    Map<String, String> h = new HashMap<>();
+    h.put("C11", "20200101");
+    h.put("F41", "3");
+    h.put("F40", "cncc.111.001.01");
+    h.put("E24", "HVPA5C30177808463743");
+    h.put("E35", "HVPA5C30177808463743");
+    h.put("A29", "{N:, K20=}");
+    h.put("F38", "HVPS");
+    h.put("K13", "01");
+    h.put("F39", "SAPS");
+    h.put("K14", "CMT");
+    h.put("K16", "");
+    h.put("C92", "102633");
+    r.setMsgHeader(h);
+    Map<String, Object> b = new HashMap<>();
+    b.put("E50", "hvps.141.001.01");
+    b.put("A00", "402451000010");
+    b.put("A01", "105100000017");
+    b.put("F32", "NORM");
+    b.put("E57", "19218385");
+    b.put("D14", "200000.00");
+    b.put("C14", "20200101");
+    b.put("F25", "02711");
+    b.put("A70", "908100000002");
+    b.put("C92", "20200101");
+    b.put("F2H", "G105");
+    r.setMsgBody(b);
+    return r;
+  }
+
+  @Override
   public MapModel testMapModel(MapModel model) {
     return model;
   }
diff --git a/demo/demo-schema/src/main/java/org/apache/servicecomb/demo/CodeFirstPojoIntf.java b/demo/demo-schema/src/main/java/org/apache/servicecomb/demo/CodeFirstPojoIntf.java
index ee958e1..38779b3 100644
--- a/demo/demo-schema/src/main/java/org/apache/servicecomb/demo/CodeFirstPojoIntf.java
+++ b/demo/demo-schema/src/main/java/org/apache/servicecomb/demo/CodeFirstPojoIntf.java
@@ -22,10 +22,14 @@ import java.util.List;
 import java.util.Map;
 
 import org.apache.servicecomb.demo.compute.Person;
+import org.apache.servicecomb.demo.mapnull.ParseRequest;
+import org.apache.servicecomb.demo.mapnull.ParseResponse;
 import org.apache.servicecomb.demo.server.MapModel;
 import org.apache.servicecomb.demo.server.User;
 
 public interface CodeFirstPojoIntf {
+  ParseResponse parse(ParseRequest request);
+
   MapModel testMapModel(MapModel model);
 
   Map<String, String> testMap(Map<String, String> map);
diff --git a/demo/demo-schema/src/main/java/org/apache/servicecomb/demo/CodeFirstPojoIntf.java b/demo/demo-schema/src/main/java/org/apache/servicecomb/demo/mapnull/ParseRequest.java
similarity index 51%
copy from demo/demo-schema/src/main/java/org/apache/servicecomb/demo/CodeFirstPojoIntf.java
copy to demo/demo-schema/src/main/java/org/apache/servicecomb/demo/mapnull/ParseRequest.java
index ee958e1..1544e99 100644
--- a/demo/demo-schema/src/main/java/org/apache/servicecomb/demo/CodeFirstPojoIntf.java
+++ b/demo/demo-schema/src/main/java/org/apache/servicecomb/demo/mapnull/ParseRequest.java
@@ -15,40 +15,49 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.demo;
+package org.apache.servicecomb.demo.mapnull;
 
-import java.util.Date;
-import java.util.List;
+import java.util.HashMap;
 import java.util.Map;
 
-import org.apache.servicecomb.demo.compute.Person;
-import org.apache.servicecomb.demo.server.MapModel;
-import org.apache.servicecomb.demo.server.User;
+public class ParseRequest {
+  public String msgType = "";
 
-public interface CodeFirstPojoIntf {
-  MapModel testMapModel(MapModel model);
+  public String strMsg;
 
-  Map<String, String> testMap(Map<String, String> map);
+  public String strID = "";
 
-  Map<String, User> testUserMap(Map<String, User> userMap);
+  public Map<String, Object> flags = new HashMap<>();
 
-  List<User> testUserArray(List<User> users);
+  public String getMsgType() {
+    return msgType;
+  }
 
-  String[] testStrings(String[] input);
+  public void setMsgType(String msgType) {
+    this.msgType = msgType;
+  }
 
-  byte[] testBytes(byte[] input);
+  public String getStrMsg() {
+    return strMsg;
+  }
 
-  int reduce(int a, int b);
+  public void setStrMsg(String strMsg) {
+    this.strMsg = strMsg;
+  }
 
-  Date addDate(Date date, long second);
+  public String getStrID() {
+    return strID;
+  }
 
-  Person sayHello(Person user);
+  public void setStrID(String strID) {
+    this.strID = strID;
+  }
 
-  String saySomething(String prefix, Person user);
+  public Map<String, Object> getFlags() {
+    return flags;
+  }
 
-  String sayHi(String name);
-
-  boolean isTrue();
-
-  String addString(List<String> s);
+  public void setFlags(Map<String, Object> flags) {
+    this.flags = flags;
+  }
 }
diff --git a/demo/demo-schema/src/main/java/org/apache/servicecomb/demo/mapnull/ParseResponse.java b/demo/demo-schema/src/main/java/org/apache/servicecomb/demo/mapnull/ParseResponse.java
new file mode 100644
index 0000000..8330fe8
--- /dev/null
+++ b/demo/demo-schema/src/main/java/org/apache/servicecomb/demo/mapnull/ParseResponse.java
@@ -0,0 +1,72 @@
+/*
+ * 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.demo.mapnull;
+
+import java.util.Map;
+
+public class ParseResponse {
+  public String resultCode = "99999999";
+
+  public String resultInfo = "unknown result";
+
+  public String msgType = "";
+
+  public Map<String, String> msgHeader;
+
+  public Map<String, Object> msgBody;
+
+  public String getResultCode() {
+    return resultCode;
+  }
+
+  public void setResultCode(String resultCode) {
+    this.resultCode = resultCode;
+  }
+
+  public String getResultInfo() {
+    return resultInfo;
+  }
+
+  public void setResultInfo(String resultInfo) {
+    this.resultInfo = resultInfo;
+  }
+
+  public String getMsgType() {
+    return msgType;
+  }
+
+  public void setMsgType(String msgType) {
+    this.msgType = msgType;
+  }
+
+  public Map<String, String> getMsgHeader() {
+    return msgHeader;
+  }
+
+  public void setMsgHeader(Map<String, String> msgHeader) {
+    this.msgHeader = msgHeader;
+  }
+
+  public Map<String, Object> getMsgBody() {
+    return msgBody;
+  }
+
+  public void setMsgBody(Map<String, Object> msgBody) {
+    this.msgBody = msgBody;
+  }
+}
diff --git a/demo/demo-springmvc/springmvc-client/src/main/java/org/apache/servicecomb/demo/springmvc/client/CodeFirstRestTemplateSpringmvc.java b/demo/demo-springmvc/springmvc-client/src/main/java/org/apache/servicecomb/demo/springmvc/client/CodeFirstRestTemplateSpringmvc.java
index 37c21ac..991016a 100644
--- a/demo/demo-springmvc/springmvc-client/src/main/java/org/apache/servicecomb/demo/springmvc/client/CodeFirstRestTemplateSpringmvc.java
+++ b/demo/demo-springmvc/springmvc-client/src/main/java/org/apache/servicecomb/demo/springmvc/client/CodeFirstRestTemplateSpringmvc.java
@@ -261,9 +261,15 @@ public class CodeFirstRestTemplateSpringmvc extends CodeFirstRestTemplate {
     map.put("form1", code);
     map.put("form2", "");
     HttpEntity<Map<String, String>> formEntiry = new HttpEntity<>(map, formHeaders);
-    // Highway will not distinguish empty string or null
-    TestMgr
-        .check(code + "null", template.postForEntity(cseUrlPrefix + "/testform", formEntiry, String.class).getBody());
+    TestMgr.check(code + "", template.postForEntity(cseUrlPrefix + "/testform", formEntiry, String.class).getBody());
+
+    map = new HashMap<>();
+    code = "servicecomb%2bwelcome%40%23%24%25%5e%26*()%3d%3d";
+    map.put("form1", code);
+    map.put("form2", null);
+    formEntiry = new HttpEntity<>(map, formHeaders);
+    TestMgr.check(code + "null",
+        template.postForEntity(cseUrlPrefix + "/testform", formEntiry, String.class).getBody());
   }
 
   private void testCodeFirstTestFormRest(RestTemplate template, String cseUrlPrefix) {
diff --git a/foundations/foundation-protobuf/src/main/java/io/protostuff/ProtobufOutputEx.java b/foundations/foundation-protobuf/src/main/java/io/protostuff/ProtobufOutputEx.java
index 41be1ed..f4a82d3 100644
--- a/foundations/foundation-protobuf/src/main/java/io/protostuff/ProtobufOutputEx.java
+++ b/foundations/foundation-protobuf/src/main/java/io/protostuff/ProtobufOutputEx.java
@@ -849,8 +849,6 @@ public final class ProtobufOutputEx extends WriteSession implements OutputEx {
   }
 
   public final void writeScalarString(int tag, int tagSize, String value) {
-    if (!value.isEmpty()) {
-      writeString(tag, tagSize, value);
-    }
+    writeString(tag, tagSize, value);
   }
 }
diff --git a/integration-tests/pojo-test/src/test/java/org/apache/servicecomb/demo/pojo/test/endpoints/CodeFirstPojo.java b/integration-tests/pojo-test/src/test/java/org/apache/servicecomb/demo/pojo/test/endpoints/CodeFirstPojo.java
index 9cd7177..fc32deb 100644
--- a/integration-tests/pojo-test/src/test/java/org/apache/servicecomb/demo/pojo/test/endpoints/CodeFirstPojo.java
+++ b/integration-tests/pojo-test/src/test/java/org/apache/servicecomb/demo/pojo/test/endpoints/CodeFirstPojo.java
@@ -23,6 +23,8 @@ import java.util.Map;
 
 import org.apache.servicecomb.demo.CodeFirstPojoIntf;
 import org.apache.servicecomb.demo.compute.Person;
+import org.apache.servicecomb.demo.mapnull.ParseRequest;
+import org.apache.servicecomb.demo.mapnull.ParseResponse;
 import org.apache.servicecomb.demo.server.MapModel;
 import org.apache.servicecomb.demo.server.User;
 import org.apache.servicecomb.provider.pojo.RpcSchema;
@@ -32,6 +34,11 @@ import org.apache.servicecomb.swagger.invocation.context.ContextUtils;
 public class CodeFirstPojo implements CodeFirstPojoIntf {
 
   @Override
+  public ParseResponse parse(ParseRequest request) {
+    return null;
+  }
+
+  @Override
   public MapModel testMapModel(MapModel model) {
     return model;
   }