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