From c320a992be01d885a26e888566d6c759afa7beb2 Mon Sep 17 00:00:00 2001 From: CodingCattwo <847701726@qq.com> Date: Mon, 15 Jun 2020 19:45:36 +0800 Subject: [PATCH 1/7] add json util --- .../webase/transaction/util/JsonUtils.java | 244 ++++++++++++++++++ 1 file changed, 244 insertions(+) create mode 100644 src/main/java/com/webank/webase/transaction/util/JsonUtils.java diff --git a/src/main/java/com/webank/webase/transaction/util/JsonUtils.java b/src/main/java/com/webank/webase/transaction/util/JsonUtils.java new file mode 100644 index 0000000..aecc329 --- /dev/null +++ b/src/main/java/com/webank/webase/transaction/util/JsonUtils.java @@ -0,0 +1,244 @@ +package com.webank.webase.transaction.util; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.DeserializationFeature; +import com.fasterxml.jackson.databind.JavaType; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.SerializationFeature; +import java.io.IOException; +import java.text.SimpleDateFormat; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; + +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.function.Supplier; + +@Slf4j +public class JsonUtils { + // private static final ObjectMapper mapper = new ObjectMapper(); + private static ObjectMapper mapper; + private static final String STANDARD_FORMAT = "yyyy-MM-dd HH:mm:ss"; + /** + * 设置一些通用的属性 + */ + static { + mapper = new ObjectMapper(); + // 如果json中有新增的字段并且是实体类类中不存在的,不报错 + // mapper.configure(DeserializationFeature.FAIL_ON_IGNORED_PROPERTIES, false); + // 如果存在未知属性,则忽略不报错 + mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); + mapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false); + // 允许key没有双引号 + mapper.configure(JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES, true); + // 允许key有单引号 + mapper.configure(JsonParser.Feature.ALLOW_SINGLE_QUOTES, true); + // 属性值为null的不参与序列化 +// mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); + mapper.setSerializationInclusion(JsonInclude.Include.ALWAYS); + // timestamp + mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false); + mapper.setDateFormat(new SimpleDateFormat(STANDARD_FORMAT)); + } + + public static String toJSONString(Object obj) { + return obj != null ? toJSONString(obj, () -> "") : ""; + } + + public static String toJSONString(Object obj, Supplier defaultSupplier) { + try { + return obj != null ? mapper.writeValueAsString(obj) : defaultSupplier.get(); + } catch (Throwable e) { + log.error(String.format("toJSONString %s", obj != null ? obj.toString() : "null"), e); + } + return defaultSupplier.get(); + } + + public static T toJavaObject(String value, Class tClass) { + return StringUtils.isNotBlank(value) ? toJavaObject(value, tClass, () -> null) : null; + } + + public static T toJavaObject(Object obj, Class tClass) { + return obj != null ? toJavaObject(toJSONString(obj), tClass, () -> null) : null; + } + + public static T toJavaObject(String value, Class tClass, Supplier defaultSupplier) { + try { + if (StringUtils.isBlank(value)) { + return defaultSupplier.get(); + } + return mapper.readValue(value, tClass); + } catch (Throwable e) { + log.error(String.format("toJavaObject exception: \n %s\n %s", value, tClass), e); + } + return defaultSupplier.get(); + } + + public static List toJavaObjectList(String value, Class tClass) { + return StringUtils.isNotBlank(value) ? toJavaObjectList(value, tClass, () -> null) : null; + } + + public static List toJavaObjectList(Object obj, Class tClass) { + return obj != null ? toJavaObjectList(toJSONString(obj), tClass, () -> null) : null; + } + + public static List toJavaObjectList(String value, Class tClass, Supplier> defaultSupplier) { + try { + if (StringUtils.isBlank(value)) { + return defaultSupplier.get(); + } + JavaType javaType = mapper.getTypeFactory().constructParametricType(List.class, tClass); + return mapper.readValue(value, javaType); + } catch (Throwable e) { + log.error(String.format("toJavaObjectList exception \n%s\n%s", value, tClass), e); + } + return defaultSupplier.get(); + } + + // 简单地直接用json复制或者转换(Cloneable) + public static T jsonCopy(Object obj, Class tClass) { + return obj != null ? toJavaObject(toJSONString(obj), tClass) : null; + } + + public static Map toMap(String value) { + return StringUtils.isNotBlank(value) ? toMap(value, () -> null) : null; + } + + public static Map toMap(Object value) { + return value != null ? toMap(value, () -> null) : null; + } + + public static Map toMap(Object value, Supplier> defaultSupplier) { + if (value == null) { + return defaultSupplier.get(); + } + try { + if (value instanceof Map) { + return (Map) value; + } + } catch (Exception e) { + log.error("fail to convert" + toJSONString(value), e); + } + return toMap(toJSONString(value), defaultSupplier); + } + + public static Map toMap(String value, Supplier> defaultSupplier) { + if (StringUtils.isBlank(value)) { + return defaultSupplier.get(); + } + try { + return toJavaObject(value, LinkedHashMap.class); + } catch (Exception e) { + log.error(String.format("toMap exception\n%s", value), e); + } + return defaultSupplier.get(); + } + + + public static List toList(String value) { + return StringUtils.isNotBlank(value) ? toList(value, () -> null) : null; + } + + public static List toList(Object value) { + return value != null ? toList(value, () -> null) : null; + } + + public static List toList(String value, Supplier> defaultSuppler) { + if (StringUtils.isBlank(value)) { + return defaultSuppler.get(); + } + try { + return toJavaObject(value, List.class); + } catch (Exception e) { + log.error("toList exception\n" + value, e); + } + return defaultSuppler.get(); + } + + public static List toList(Object value, Supplier> defaultSuppler) { + if (value == null) { + return defaultSuppler.get(); + } + if (value instanceof List) { + return (List) value; + } + return toList(toJSONString(value), defaultSuppler); + } + + /* author: clk */ + + public static boolean isJson(String str) { + try { + mapper.readTree(str); + return true; + } catch (IOException e) { + return false; + } + } + + public static JsonNode stringToJsonNode(String str) { + try { + return mapper.readTree(str); + } catch (IOException e) { + log.error("Parse String to JsonNode error : {}", e.getMessage()); + return null; + } + } + + public static String objToString(T obj) { + if (obj == null) { + return null; + } + try { + return obj instanceof String ? (String) obj + : mapper.writerWithDefaultPrettyPrinter().writeValueAsString(obj); + } catch (JsonProcessingException e) { + log.error("Parse Object to String error : {}", e.getMessage()); + return null; + } + } + + @SuppressWarnings("unchecked") + public static T stringToObj(String str, Class clazz) { + if (StringUtils.isEmpty(str) || clazz == null) { + return null; + } + try { + return clazz.equals(String.class) ? (T) str : mapper.readValue(str, clazz); + } catch (Exception e) { + log.error("Parse String to Object error : {}", e.getMessage()); + return null; + } + } + + @SuppressWarnings("unchecked") + public static T stringToObj(String str, TypeReference typeReference) { + if (StringUtils.isEmpty(str) || typeReference == null) { + return null; + } + try { + return (T) (typeReference.getType().equals(String.class) ? str + : mapper.readValue(str, typeReference)); + } catch (IOException e) { + log.error("Parse String to Object error", e); + return null; + } + } + + public static T stringToObj(String str, Class collectionClazz, + Class... elementClazzes) { + JavaType javaType = mapper.getTypeFactory() + .constructParametricType(collectionClazz, elementClazzes); + try { + return mapper.readValue(str, javaType); + } catch (IOException e) { + log.error("Parse String to Object error : {}" + e.getMessage()); + return null; + } + } +} From 9e1f4acd075189f80018658c48cbe0375e668460 Mon Sep 17 00:00:00 2001 From: CodingCattwo <847701726@qq.com> Date: Mon, 15 Jun 2020 19:46:07 +0800 Subject: [PATCH 2/7] replace fastjson with jackson --- .../transaction/base/BaseController.java | 12 ++++--- .../config/MyComplexShardingAlgorithm.java | 6 ++-- .../contract/ContractController.java | 4 +-- .../transaction/contract/ContractService.java | 13 ++++---- .../transaction/keystore/KeyStoreService.java | 8 ++--- .../transaction/trans/TransController.java | 6 ++-- .../transaction/trans/TransService.java | 21 +++++++----- .../webase/transaction/util/CommonUtils.java | 6 ++-- .../transaction/util/ContractAbiUtil.java | 33 ++++++++----------- 9 files changed, 54 insertions(+), 55 deletions(-) diff --git a/src/main/java/com/webank/webase/transaction/base/BaseController.java b/src/main/java/com/webank/webase/transaction/base/BaseController.java index bd54e95..80623f4 100644 --- a/src/main/java/com/webank/webase/transaction/base/BaseController.java +++ b/src/main/java/com/webank/webase/transaction/base/BaseController.java @@ -14,8 +14,8 @@ package com.webank.webase.transaction.base; -import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONObject; +import com.webank.webase.transaction.util.JsonUtils; + import com.webank.webase.transaction.base.exception.BaseException; import java.util.List; import lombok.extern.slf4j.Slf4j; @@ -47,8 +47,10 @@ protected ResponseEntity checkParamResult(BindingResult bindingResult) throws Ba RetCode retCode = null; try { - JSONObject jsonObject = JSON.parseObject(errorMsg); - retCode = JSONObject.toJavaObject(jsonObject, RetCode.class); + retCode = JsonUtils.toJavaObject(errorMsg, RetCode.class); + if (retCode == null) { + log.error("json parse error"); + } } catch (Exception ex) { log.warn("OnWarning:retCodeJson convert error"); throw new BaseException(ConstantCode.PARAM_VAILD_FAIL); @@ -65,7 +67,7 @@ protected ResponseEntity checkParamResult(BindingResult bindingResult) throws Ba */ private String getParamValidFaildMessage(BindingResult bindingResult) { List errorList = bindingResult.getAllErrors(); - log.info("errorList:{}", JSON.toJSONString(errorList)); + log.info("errorList:{}", JsonUtils.toJSONString(errorList)); if (errorList == null) { log.warn("onWarning:errorList is empty!"); return null; diff --git a/src/main/java/com/webank/webase/transaction/config/MyComplexShardingAlgorithm.java b/src/main/java/com/webank/webase/transaction/config/MyComplexShardingAlgorithm.java index ccdf231..3656612 100644 --- a/src/main/java/com/webank/webase/transaction/config/MyComplexShardingAlgorithm.java +++ b/src/main/java/com/webank/webase/transaction/config/MyComplexShardingAlgorithm.java @@ -14,7 +14,7 @@ package com.webank.webase.transaction.config; -import com.alibaba.fastjson.JSON; +import com.webank.webase.transaction.util.JsonUtils; import io.shardingsphere.api.algorithm.sharding.ListShardingValue; import io.shardingsphere.api.algorithm.sharding.ShardingValue; import io.shardingsphere.api.algorithm.sharding.complex.ComplexKeysShardingAlgorithm; @@ -35,8 +35,8 @@ public class MyComplexShardingAlgorithm implements ComplexKeysShardingAlgorithm @Override public Collection doSharding(Collection collection, Collection shardingValues) { - log.debug("collection:" + JSON.toJSONString(collection) + ",shardingValues:" - + JSON.toJSONString(shardingValues)); + log.debug("collection:" + JsonUtils.toJSONString(collection) + ",shardingValues:" + + JsonUtils.toJSONString(shardingValues)); // table sharding by id and gmt_create Collection idValues = getLongShardingValue(shardingValues, "id"); Collection gmtValues = getDateShardingValue(shardingValues, "gmt_create"); diff --git a/src/main/java/com/webank/webase/transaction/contract/ContractController.java b/src/main/java/com/webank/webase/transaction/contract/ContractController.java index 2cd3c24..703dd8e 100644 --- a/src/main/java/com/webank/webase/transaction/contract/ContractController.java +++ b/src/main/java/com/webank/webase/transaction/contract/ContractController.java @@ -14,7 +14,7 @@ package com.webank.webase.transaction.contract; -import com.alibaba.fastjson.JSON; +import com.webank.webase.transaction.util.JsonUtils; import com.webank.webase.transaction.base.BaseController; import com.webank.webase.transaction.base.ResponseEntity; import com.webank.webase.transaction.base.exception.BaseException; @@ -74,7 +74,7 @@ public ResponseEntity compile( @PostMapping("/deploy") public ResponseEntity deploy(@Valid @RequestBody ReqDeployInfo deployInfo, BindingResult result) throws BaseException { - log.info("deploy start. deployInfo:{}", JSON.toJSONString(deployInfo)); + log.info("deploy start. deployInfo:{}", JsonUtils.toJSONString(deployInfo)); checkParamResult(result); return contractService.deploy(deployInfo); } diff --git a/src/main/java/com/webank/webase/transaction/contract/ContractService.java b/src/main/java/com/webank/webase/transaction/contract/ContractService.java index f7ba894..f87147e 100644 --- a/src/main/java/com/webank/webase/transaction/contract/ContractService.java +++ b/src/main/java/com/webank/webase/transaction/contract/ContractService.java @@ -14,8 +14,6 @@ package com.webank.webase.transaction.contract; -import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONArray; import com.webank.webase.transaction.base.ConstantCode; import com.webank.webase.transaction.base.ConstantProperties; import com.webank.webase.transaction.base.ResponseEntity; @@ -28,6 +26,7 @@ import com.webank.webase.transaction.trans.TransService; import com.webank.webase.transaction.util.CommonUtils; import com.webank.webase.transaction.util.ContractAbiUtil; +import com.webank.webase.transaction.util.JsonUtils; import com.webank.webase.transaction.util.LogUtils; import java.io.File; import java.io.IOException; @@ -121,7 +120,7 @@ public ResponseEntity compile(MultipartFile zipFile) throws BaseException, IOExc compileInfo.setContractName(contractName); compileInfo.setContractBin(result.getContract(contractName).bin); compileInfo - .setContractAbi(JSONArray.parseArray(result.getContract(contractName).abi)); + .setContractAbi(JsonUtils.toJavaObjectList(result.getContract(contractName).abi, Object.class)); compileInfos.add(compileInfo); } } @@ -172,7 +171,7 @@ public ResponseEntity deploy(ReqDeployInfo req) throws BaseException { } } // check parameters - String contractAbi = JSON.toJSONString(req.getContractAbi()); + String contractAbi = JsonUtils.toJSONString(req.getContractAbi()); List params = req.getFuncParam(); AbiDefinition abiDefinition = ContractAbiUtil.getAbiDefinition(contractAbi); List funcInputTypes = ContractAbiUtil.getFuncInputType(abiDefinition); @@ -188,7 +187,7 @@ public ResponseEntity deploy(ReqDeployInfo req) throws BaseException { deployInfoDto.setUuidDeploy(uuid); deployInfoDto.setContractBin(req.getContractBin()); deployInfoDto.setContractAbi(contractAbi); - deployInfoDto.setFuncParam(JSON.toJSONString(params)); + deployInfoDto.setFuncParam(JsonUtils.toJSONString(params)); deployInfoDto.setSignType(req.getSignType()); deployInfoDto.setSignUserId(req.getSignUserId()); deployInfoDto.setGmtCreate(new Date()); @@ -308,7 +307,7 @@ public void run() { * @param deployInfoDto deployInfoDto */ public void deploySend(DeployInfoDto deployInfoDto) { - log.debug("deploySend deployInfoDto:{}", JSON.toJSONString(deployInfoDto)); + log.debug("deploySend deployInfoDto:{}", JsonUtils.toJSONString(deployInfoDto)); Long id = deployInfoDto.getId(); log.info("deploySend id:{}", id); int groupId = deployInfoDto.getGroupId(); @@ -334,7 +333,7 @@ public void deploySend(DeployInfoDto deployInfoDto) { String contractAbi = deployInfoDto.getContractAbi(); String contractBin = deployInfoDto.getContractBin(); - List params = JSONArray.parseArray(deployInfoDto.getFuncParam()); + List params = JsonUtils.toJavaObjectList(deployInfoDto.getFuncParam(), Object.class); // get function abi AbiDefinition abiDefinition = ContractAbiUtil.getAbiDefinition(contractAbi); diff --git a/src/main/java/com/webank/webase/transaction/keystore/KeyStoreService.java b/src/main/java/com/webank/webase/transaction/keystore/KeyStoreService.java index 4cc278c..2eb276c 100644 --- a/src/main/java/com/webank/webase/transaction/keystore/KeyStoreService.java +++ b/src/main/java/com/webank/webase/transaction/keystore/KeyStoreService.java @@ -14,7 +14,7 @@ package com.webank.webase.transaction.keystore; -import com.alibaba.fastjson.JSON; +import com.webank.webase.transaction.util.JsonUtils; import com.webank.webase.transaction.base.ConstantCode; import com.webank.webase.transaction.base.ConstantProperties; import com.webank.webase.transaction.base.ResponseEntity; @@ -121,10 +121,10 @@ public String getSignData(EncodeInfo params) { log.info("getSignData url:{}", url); HttpHeaders headers = CommonUtils.buildHeaders(); HttpEntity formEntity = - new HttpEntity(JSON.toJSONString(params), headers); + new HttpEntity(JsonUtils.toJSONString(params), headers); ResponseEntity response = restTemplate.postForObject(url, formEntity, ResponseEntity.class); - log.info("getSignData response:{}", JSON.toJSONString(response)); + log.info("getSignData response:{}", JsonUtils.toJSONString(response)); if (response.getCode() == 0) { signInfo = CommonUtils.object2JavaBean(response.getData(), SignInfo.class); } @@ -148,7 +148,7 @@ public boolean checkSignUserId(String signUserId) { String url = String.format(SIGN_USERINFO_URL, properties.getSignServer(), signUserId); log.info("checkSignUserId url:{}", url); ResponseEntity response = restTemplate.getForObject(url, ResponseEntity.class); - log.info("checkSignUserId response:{}", JSON.toJSONString(response)); + log.info("checkSignUserId response:{}", JsonUtils.toJSONString(response)); if (response.getCode() == 0) { return true; } diff --git a/src/main/java/com/webank/webase/transaction/trans/TransController.java b/src/main/java/com/webank/webase/transaction/trans/TransController.java index 9909310..41ad8df 100644 --- a/src/main/java/com/webank/webase/transaction/trans/TransController.java +++ b/src/main/java/com/webank/webase/transaction/trans/TransController.java @@ -14,7 +14,7 @@ package com.webank.webase.transaction.trans; -import com.alibaba.fastjson.JSON; +import com.webank.webase.transaction.util.JsonUtils; import com.webank.webase.transaction.base.BaseController; import com.webank.webase.transaction.base.ResponseEntity; import com.webank.webase.transaction.base.exception.BaseException; @@ -56,7 +56,7 @@ public class TransController extends BaseController { @PostMapping("/send") public ResponseEntity send(@Valid @RequestBody ReqTransSendInfo transSendInfo, BindingResult result) throws BaseException { - log.info("transSend start. transSendInfo:{}", JSON.toJSONString(transSendInfo)); + log.info("transSend start. transSendInfo:{}", JsonUtils.toJSONString(transSendInfo)); checkParamResult(result); return transService.save(transSendInfo); } @@ -72,7 +72,7 @@ public ResponseEntity send(@Valid @RequestBody ReqTransSendInfo transSendInfo, @PostMapping("/call") public ResponseEntity call(@Valid @RequestBody ReqTransCallInfo transCallInfo, BindingResult result) throws BaseException { - log.info("call start. transCallInfo:{}", JSON.toJSONString(transCallInfo)); + log.info("call start. transCallInfo:{}", JsonUtils.toJSONString(transCallInfo)); checkParamResult(result); return transService.call(transCallInfo); } diff --git a/src/main/java/com/webank/webase/transaction/trans/TransService.java b/src/main/java/com/webank/webase/transaction/trans/TransService.java index a041ab3..1fe4749 100644 --- a/src/main/java/com/webank/webase/transaction/trans/TransService.java +++ b/src/main/java/com/webank/webase/transaction/trans/TransService.java @@ -14,9 +14,7 @@ package com.webank.webase.transaction.trans; -import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONArray; -import com.alibaba.fastjson.JSONObject; +import com.fasterxml.jackson.databind.JsonNode; import com.webank.webase.transaction.base.ConstantCode; import com.webank.webase.transaction.base.ConstantProperties; import com.webank.webase.transaction.base.ResponseEntity; @@ -33,6 +31,7 @@ import com.webank.webase.transaction.util.CommonUtils; import com.webank.webase.transaction.util.ContractAbiUtil; import com.webank.webase.transaction.util.LogUtils; +import com.webank.webase.transaction.util.JsonUtils; import java.io.IOException; import java.math.BigInteger; import java.util.Date; @@ -160,7 +159,7 @@ public ResponseEntity save(ReqTransSendInfo req) throws BaseException { throw new BaseException(ConstantCode.CONTRACT_ABI_EMPTY); } } else { - contractAbi = JSON.toJSONString(abiList); + contractAbi = JsonUtils.toJSONString(abiList); } // check function String funcName = req.getFuncName(); @@ -193,7 +192,7 @@ public ResponseEntity save(ReqTransSendInfo req) throws BaseException { transInfoDto.setContractAbi(contractAbi); transInfoDto.setContractAddress(contractAddress); transInfoDto.setFuncName(funcName); - transInfoDto.setFuncParam(JSON.toJSONString(params)); + transInfoDto.setFuncParam(JsonUtils.toJSONString(params)); transInfoDto.setSignType(req.getSignType()); transInfoDto.setSignUserId(req.getSignUserId()); transInfoDto.setGmtCreate(new Date()); @@ -248,7 +247,7 @@ public ResponseEntity call(ReqTransCallInfo req) throws BaseException { throw new BaseException(ConstantCode.CONTRACT_ABI_EMPTY); } } else { - contractAbi = JSON.toJSONString(abiList); + contractAbi = JsonUtils.toJSONString(abiList); } // check function AbiDefinition abiDefinition = ContractAbiUtil.getAbiDefinition(funcName, contractAbi); @@ -429,7 +428,7 @@ public void run() { * @param transInfoDto transaction info */ public void transSend(TransInfoDto transInfoDto) { - log.debug("transSend transInfoDto:{}", JSON.toJSONString(transInfoDto)); + log.debug("transSend transInfoDto:{}", JsonUtils.toJSONString(transInfoDto)); Long id = transInfoDto.getId(); log.info("transSend id:{}", id); int groupId = transInfoDto.getGroupId(); @@ -456,7 +455,7 @@ public void transSend(TransInfoDto transInfoDto) { String contractAbi = transInfoDto.getContractAbi(); String contractAddress = transInfoDto.getContractAddress(); String funcName = transInfoDto.getFuncName(); - List params = JSONArray.parseArray(transInfoDto.getFuncParam()); + List params = JsonUtils.toJavaObjectList(transInfoDto.getFuncParam(), Object.class); // get function abi AbiDefinition abiDefinition = ContractAbiUtil.getAbiDefinition(funcName, contractAbi); @@ -541,7 +540,11 @@ public String signMessage(int groupId, int signType, String signUserId, String c signMsg = Numeric.toHexString(signedMessage); } } else { - String chainId = (String) JSONObject.parseObject(versionContent).get("Chain Id"); + JsonNode version = JsonUtils.stringToJsonNode(versionContent); + if (version == null) { + log.error("parse json error"); + } + String chainId = version.get("Chain Id").asText(); ExtendedRawTransaction extendedRawTransaction = ExtendedRawTransaction.createTransaction(randomid, ConstantProperties.GAS_PRICE, ConstantProperties.GAS_LIMIT, blockLimit, contractAddress, diff --git a/src/main/java/com/webank/webase/transaction/util/CommonUtils.java b/src/main/java/com/webank/webase/transaction/util/CommonUtils.java index eb1d073..11df4f7 100644 --- a/src/main/java/com/webank/webase/transaction/util/CommonUtils.java +++ b/src/main/java/com/webank/webase/transaction/util/CommonUtils.java @@ -14,7 +14,7 @@ package com.webank.webase.transaction.util; -import com.alibaba.fastjson.JSON; +import com.webank.webase.transaction.util.JsonUtils; import com.webank.webase.transaction.base.ConstantCode; import com.webank.webase.transaction.base.exception.BaseException; import java.io.Closeable; @@ -244,8 +244,8 @@ public static T object2JavaBean(Object obj, Class clazz) { log.warn("Object2JavaBean. obj or clazz null"); return null; } - String jsonStr = JSON.toJSONString(obj); - return JSON.parseObject(jsonStr, clazz); + String jsonStr = JsonUtils.toJSONString(obj); + return JsonUtils.toJavaObject(jsonStr, clazz); } /** diff --git a/src/main/java/com/webank/webase/transaction/util/ContractAbiUtil.java b/src/main/java/com/webank/webase/transaction/util/ContractAbiUtil.java index 1bd820f..778b12c 100644 --- a/src/main/java/com/webank/webase/transaction/util/ContractAbiUtil.java +++ b/src/main/java/com/webank/webase/transaction/util/ContractAbiUtil.java @@ -14,8 +14,6 @@ package com.webank.webase.transaction.util; -import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONArray; import com.webank.webase.transaction.base.ConstantProperties; import com.webank.webase.transaction.base.exception.BaseException; import java.io.File; @@ -87,10 +85,9 @@ public static void saveSolFile(String toolDir, String contractName, byte[] contr * @return */ public static AbiDefinition getAbiDefinition(String contractAbi) { - JSONArray abiArr = JSONArray.parseArray(contractAbi); + List abiArr = JsonUtils.toJavaObjectList(contractAbi, AbiDefinition.class); AbiDefinition result = null; - for (Object object : abiArr) { - AbiDefinition abiDefinition = JSON.parseObject(object.toString(), AbiDefinition.class); + for (AbiDefinition abiDefinition : abiArr) { if (ConstantProperties.TYPE_CONSTRUCTOR.equals(abiDefinition.getType())) { result = abiDefinition; break; @@ -107,12 +104,11 @@ public static AbiDefinition getAbiDefinition(String contractAbi) { * @return */ public static AbiDefinition getAbiDefinition(String name, String contractAbi) { - JSONArray abiArr = JSONArray.parseArray(contractAbi); + List abiArr = JsonUtils.toJavaObjectList(contractAbi, AbiDefinition.class); AbiDefinition result = null; - for (Object object : abiArr) { - AbiDefinition abiDefinition = JSON.parseObject(object.toString(), AbiDefinition.class); + for (AbiDefinition abiDefinition : abiArr) { if (ConstantProperties.TYPE_FUNCTION.equals(abiDefinition.getType()) - && name.equals(abiDefinition.getName())) { + && name.equals(abiDefinition.getName())) { result = abiDefinition; break; } @@ -127,10 +123,9 @@ public static AbiDefinition getAbiDefinition(String name, String contractAbi) { * @return */ public static List getEventAbiDefinitions(String contractAbi) { - JSONArray abiArr = JSONArray.parseArray(contractAbi); + List abiArr = JsonUtils.toJavaObjectList(contractAbi, AbiDefinition.class); List result = new ArrayList<>(); - for (Object object : abiArr) { - AbiDefinition abiDefinition = JSON.parseObject(object.toString(), AbiDefinition.class); + for (AbiDefinition abiDefinition : abiArr) { if (ConstantProperties.TYPE_EVENT.equals(abiDefinition.getType())) { result.add(abiDefinition); } @@ -183,8 +178,8 @@ public static List inputFormat(List funcInputTypes, List p for (int i = 0; i < funcInputTypes.size(); i++) { Class inputType = null; Object input = null; - if (funcInputTypes.get(i).indexOf("[") != -1 - && funcInputTypes.get(i).indexOf("]") != -1) { + if (funcInputTypes.get(i).contains("[") + && funcInputTypes.get(i).contains("]")) { List arrList = new ArrayList<>(Arrays.asList(params.get(i).toString().split(","))); inputType = ContractTypeUtil.getType( @@ -219,8 +214,8 @@ public static List> outputFormat(List funOutputTypes) for (int i = 0; i < funOutputTypes.size(); i++) { Class outputType = null; TypeReference typeReference = null; - if (funOutputTypes.get(i).indexOf("[") != -1 - && funOutputTypes.get(i).indexOf("]") != -1) { + if (funOutputTypes.get(i).contains("[") + && funOutputTypes.get(i).contains("]")) { typeReference = ContractTypeUtil.getArrayType( funOutputTypes.get(i).substring(0, funOutputTypes.get(i).indexOf("["))); } else { @@ -246,8 +241,8 @@ public static Object callResultParse(List funOutputTypes, List typ for (int i = 0; i < funOutputTypes.size(); i++) { Class outputType = null; Object value = null; - if (funOutputTypes.get(i).indexOf("[") != -1 - && funOutputTypes.get(i).indexOf("]") != -1) { + if (funOutputTypes.get(i).contains("[") + && funOutputTypes.get(i).contains("]")) { List values = new ArrayList<>(); List results = (List) typeList.get(i).getValue(); for (int j = 0; j < results.size(); j++) { @@ -263,7 +258,7 @@ public static Object callResultParse(List funOutputTypes, List typ result.add(value); } } - return JSON.parse(JSON.toJSONString(result)); + return JsonUtils.toJavaObject(JsonUtils.toJSONString(result), Object.class); } return null; } From 6f455d9fc5e023bdf3f742e3d81f995291761492 Mon Sep 17 00:00:00 2001 From: CodingCattwo <847701726@qq.com> Date: Tue, 16 Jun 2020 10:51:18 +0800 Subject: [PATCH 3/7] update dependencies & comments --- build.gradle | 50 +++++++++---------- .../webase/transaction/util/JsonUtils.java | 4 ++ 2 files changed, 27 insertions(+), 27 deletions(-) diff --git a/build.gradle b/build.gradle index 7615280..f780034 100644 --- a/build.gradle +++ b/build.gradle @@ -13,6 +13,7 @@ targetCompatibility = 1.8 // In this section you declare where to find the dependencies of your project repositories { maven { url "http://maven.aliyun.com/nexus/content/groups/public/"} + maven { url "https://oss.sonatype.org/content/repositories/snapshots" } maven { url 'https://dl.bintray.com/ethereum/maven/'} mavenLocal() mavenCentral() @@ -24,7 +25,15 @@ List spring_boot =[ "org.springframework.boot:spring-boot-starter-web:$spring_boot_version", "org.springframework.boot:spring-boot-autoconfigure:$spring_boot_version", "org.springframework.boot:spring-boot-configuration-processor:$spring_boot_version", - // "org.springframework.boot:spring-boot-starter-log4j2:$spring_boot_version" +] + +// cover old version +def spring_version="4.3.27.RELEASE" +List spring =[ + "org.springframework:spring-web:$spring_version", + "org.springframework:spring-webmvc:$spring_version", + "org.springframework:spring-jdbc:$spring_version", + "org.springframework:spring-messaging:$spring_version", ] List mysql = [ @@ -38,18 +47,12 @@ List swagger = [ 'io.springfox:springfox-swagger-ui:2.8.0' ] -def log4j_version="2.13.1" -List logger = [ +def log4j_version="2.13.3" +List log4j = [ "org.apache.logging.log4j:log4j-api:$log4j_version", "org.apache.logging.log4j:log4j-core:$log4j_version", "org.apache.logging.log4j:log4j-slf4j-impl:$log4j_version", - "org.apache.logging.log4j:log4j-web:$log4j_version", - "org.slf4j:jcl-over-slf4j:1.7.12" -] - -List netty = [ - 'io.netty:netty-all:4.1.15.Final', - 'io.netty:netty-tcnative:2.0.0.Final' + "org.apache.logging.log4j:log4j-web:$log4j_version" ] List dangdang = [ @@ -62,15 +65,6 @@ List zookeeper = [ 'com.github.sgroschupf:zkclient:0.1' ] -List web3sdk = [ -// 'org.ethereum:solcJ-all:0.4.25', // web3sdk已包含该包 无需再次引入 - 'org.apache.httpcomponents:httpclient:4.5.2', - 'org.bouncycastle:bcprov-jdk15on:1.54', - 'com.lambdaworks:scrypt:1.4.0', - 'com.squareup:javapoet:1.7.0', - 'io.reactivex.rxjava2:rxjava:2.2.7', - 'com.github.jnr:jnr-unixsocket:0.15' -] List jaxb = [ "javax.xml.bind:jaxb-api:2.3.0", @@ -79,22 +73,24 @@ List jaxb = [ "javax.activation:activation:1.1.1" ] +def jackson_version = "2.11.0" List jackson = [ - "com.fasterxml.jackson.core:jackson-databind:2.10.0", - "com.fasterxml.jackson.module:jackson-module-parameter-names:2.10.0", - "com.fasterxml.jackson.datatype:jackson-datatype-jdk8:2.10.0", - "com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.10.0" + "com.fasterxml.jackson.core:jackson-databind:$jackson_version", + "com.fasterxml.jackson.core:jackson-annotations:$jackson_version", + "com.fasterxml.jackson.core:jackson-core:$jackson_version", + "com.fasterxml.jackson.module:jackson-module-parameter-names:$jackson_version", + "com.fasterxml.jackson.datatype:jackson-datatype-jdk8:$jackson_version", + "com.fasterxml.jackson.datatype:jackson-datatype-jsr310:$jackson_version", ] dependencies { - compile spring_boot,mysql,swagger,web3sdk,logger,netty,dangdang,zookeeper,jaxb,jackson - // guomi contract compile: USE 'socJ-all-0.4.25-gm' to REPLACE 'ethereum:solcJ-all' - compile "org.fisco-bcos:web3sdk:2.4.0" + compile spring_boot,spring,mysql,swagger,log4j,dangdang,zookeeper,jaxb,jackson + compile "org.fisco-bcos:web3sdk:2.4.1" // support guomi/ecdsa same time, support solcJ-0.5.2 compile "org.fisco-bcos:solcJ:0.4.25-rc1" + compile "org.slf4j:jcl-over-slf4j:1.7.30" compile "org.apache.commons:commons-lang3:3.6" compile "commons-io:commons-io:2.4" - compile "com.alibaba:fastjson:1.2.70" compile "io.shardingsphere:sharding-jdbc-spring-boot-starter:3.1.0" compile 'org.projectlombok:lombok:1.18.2' annotationProcessor 'org.projectlombok:lombok:1.18.2' diff --git a/src/main/java/com/webank/webase/transaction/util/JsonUtils.java b/src/main/java/com/webank/webase/transaction/util/JsonUtils.java index aecc329..835ad2b 100644 --- a/src/main/java/com/webank/webase/transaction/util/JsonUtils.java +++ b/src/main/java/com/webank/webase/transaction/util/JsonUtils.java @@ -19,6 +19,10 @@ import java.util.Map; import java.util.function.Supplier; +/** + * Jackson Util + * edit by marsli from hujkay + */ @Slf4j public class JsonUtils { // private static final ObjectMapper mapper = new ObjectMapper(); From b70b36a678570917dbe500791a41ae003a0aeb60 Mon Sep 17 00:00:00 2001 From: marsli Date: Wed, 17 Jun 2020 11:54:56 +0800 Subject: [PATCH 4/7] v.1.3.2 --- Changelog.md | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/Changelog.md b/Changelog.md index e67f554..d0da3f2 100644 --- a/Changelog.md +++ b/Changelog.md @@ -1,3 +1,21 @@ +### v1.3.2 + + (2020-06-17) + +**Fix** +- 移除Fastjson,替换为Jackson 2.11.0; web3sdk升级为2.4.1 +- 升级依赖包:spring: 4.3.27; log4j: 2.13.3; slf4j: 1.7.30; + +**兼容性** + +- 支持FISCO-BCOS v2.0.0-rc1 版本 +- 支持FISCO-BCOS v2.0.0-rc2 版本 +- 支持FISCO-BCOS v2.0.0-rc3 版本 +- 支持FISCO-BCOS v2.0.0 及以上版本 +- WeBASE-Sign v1.3.0+ + +详细了解,请阅读[**技术文档**](https://webasedoc.readthedocs.io/zh_CN/latest/)。 + ### v1.3.1 (2020-06-01) @@ -11,7 +29,7 @@ - 支持FISCO-BCOS v2.0.0-rc2 版本 - 支持FISCO-BCOS v2.0.0-rc3 版本 - 支持FISCO-BCOS v2.0.0 及以上版本 -- WeBASE-Sign v1.3.0 +- WeBASE-Sign v1.3.0+ 详细了解,请阅读[**技术文档**](https://webasedoc.readthedocs.io/zh_CN/latest/)。 From 6b7fa744c906abda09c0795b5b0634b54f542c24 Mon Sep 17 00:00:00 2001 From: marsli Date: Thu, 18 Jun 2020 14:21:28 +0800 Subject: [PATCH 5/7] optimize with threadlocal --- .../webase/transaction/util/JsonUtils.java | 54 +++++++++---------- 1 file changed, 26 insertions(+), 28 deletions(-) diff --git a/src/main/java/com/webank/webase/transaction/util/JsonUtils.java b/src/main/java/com/webank/webase/transaction/util/JsonUtils.java index 835ad2b..6eeda4a 100644 --- a/src/main/java/com/webank/webase/transaction/util/JsonUtils.java +++ b/src/main/java/com/webank/webase/transaction/util/JsonUtils.java @@ -1,7 +1,7 @@ package com.webank.webase.transaction.util; -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.annotation.JsonInclude.Include; +import com.fasterxml.jackson.core.JsonParser.Feature; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.DeserializationFeature; @@ -25,30 +25,28 @@ */ @Slf4j public class JsonUtils { - // private static final ObjectMapper mapper = new ObjectMapper(); - private static ObjectMapper mapper; private static final String STANDARD_FORMAT = "yyyy-MM-dd HH:mm:ss"; /** * 设置一些通用的属性 */ - static { - mapper = new ObjectMapper(); - // 如果json中有新增的字段并且是实体类类中不存在的,不报错 - // mapper.configure(DeserializationFeature.FAIL_ON_IGNORED_PROPERTIES, false); + private static final ThreadLocal OBJECT_MAPPER = ThreadLocal.withInitial(() -> { + ObjectMapper objectMapper = new ObjectMapper(); // 如果存在未知属性,则忽略不报错 - mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); - mapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false); + objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); + objectMapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false); // 允许key没有双引号 - mapper.configure(JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES, true); + objectMapper.configure(Feature.ALLOW_UNQUOTED_FIELD_NAMES, true); // 允许key有单引号 - mapper.configure(JsonParser.Feature.ALLOW_SINGLE_QUOTES, true); + objectMapper.configure(Feature.ALLOW_SINGLE_QUOTES, true); // 属性值为null的不参与序列化 -// mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); - mapper.setSerializationInclusion(JsonInclude.Include.ALWAYS); + // objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); + objectMapper.setSerializationInclusion(Include.ALWAYS); // timestamp - mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false); - mapper.setDateFormat(new SimpleDateFormat(STANDARD_FORMAT)); - } + objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false); + // date format + objectMapper.setDateFormat(new SimpleDateFormat(STANDARD_FORMAT)); + return objectMapper; + }); public static String toJSONString(Object obj) { return obj != null ? toJSONString(obj, () -> "") : ""; @@ -56,7 +54,7 @@ public static String toJSONString(Object obj) { public static String toJSONString(Object obj, Supplier defaultSupplier) { try { - return obj != null ? mapper.writeValueAsString(obj) : defaultSupplier.get(); + return obj != null ? OBJECT_MAPPER.get().writeValueAsString(obj) : defaultSupplier.get(); } catch (Throwable e) { log.error(String.format("toJSONString %s", obj != null ? obj.toString() : "null"), e); } @@ -76,7 +74,7 @@ public static T toJavaObject(String value, Class tClass, Supplier defa if (StringUtils.isBlank(value)) { return defaultSupplier.get(); } - return mapper.readValue(value, tClass); + return OBJECT_MAPPER.get().readValue(value, tClass); } catch (Throwable e) { log.error(String.format("toJavaObject exception: \n %s\n %s", value, tClass), e); } @@ -96,8 +94,8 @@ public static List toJavaObjectList(String value, Class tClass, Suppli if (StringUtils.isBlank(value)) { return defaultSupplier.get(); } - JavaType javaType = mapper.getTypeFactory().constructParametricType(List.class, tClass); - return mapper.readValue(value, javaType); + JavaType javaType = OBJECT_MAPPER.get().getTypeFactory().constructParametricType(List.class, tClass); + return OBJECT_MAPPER.get().readValue(value, javaType); } catch (Throwable e) { log.error(String.format("toJavaObjectList exception \n%s\n%s", value, tClass), e); } @@ -178,7 +176,7 @@ public static List toList(Object value, Supplier> defaultSu public static boolean isJson(String str) { try { - mapper.readTree(str); + OBJECT_MAPPER.get().readTree(str); return true; } catch (IOException e) { return false; @@ -187,7 +185,7 @@ public static boolean isJson(String str) { public static JsonNode stringToJsonNode(String str) { try { - return mapper.readTree(str); + return OBJECT_MAPPER.get().readTree(str); } catch (IOException e) { log.error("Parse String to JsonNode error : {}", e.getMessage()); return null; @@ -200,7 +198,7 @@ public static String objToString(T obj) { } try { return obj instanceof String ? (String) obj - : mapper.writerWithDefaultPrettyPrinter().writeValueAsString(obj); + : OBJECT_MAPPER.get().writerWithDefaultPrettyPrinter().writeValueAsString(obj); } catch (JsonProcessingException e) { log.error("Parse Object to String error : {}", e.getMessage()); return null; @@ -213,7 +211,7 @@ public static T stringToObj(String str, Class clazz) { return null; } try { - return clazz.equals(String.class) ? (T) str : mapper.readValue(str, clazz); + return clazz.equals(String.class) ? (T) str : OBJECT_MAPPER.get().readValue(str, clazz); } catch (Exception e) { log.error("Parse String to Object error : {}", e.getMessage()); return null; @@ -227,7 +225,7 @@ public static T stringToObj(String str, TypeReference typeReference) { } try { return (T) (typeReference.getType().equals(String.class) ? str - : mapper.readValue(str, typeReference)); + : OBJECT_MAPPER.get().readValue(str, typeReference)); } catch (IOException e) { log.error("Parse String to Object error", e); return null; @@ -236,10 +234,10 @@ public static T stringToObj(String str, TypeReference typeReference) { public static T stringToObj(String str, Class collectionClazz, Class... elementClazzes) { - JavaType javaType = mapper.getTypeFactory() + JavaType javaType = OBJECT_MAPPER.get().getTypeFactory() .constructParametricType(collectionClazz, elementClazzes); try { - return mapper.readValue(str, javaType); + return OBJECT_MAPPER.get().readValue(str, javaType); } catch (IOException e) { log.error("Parse String to Object error : {}" + e.getMessage()); return null; From 2259746697fb80cc1edd078c37e25542a0b35a43 Mon Sep 17 00:00:00 2001 From: CodingCattwo <847701726@qq.com> Date: Fri, 19 Jun 2020 17:40:05 +0800 Subject: [PATCH 6/7] upgrade tomcat springboot --- build.gradle | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/build.gradle b/build.gradle index f780034..119e5a1 100644 --- a/build.gradle +++ b/build.gradle @@ -20,7 +20,7 @@ repositories { } -def spring_boot_version="1.5.9.RELEASE" +def spring_boot_version="1.5.22.RELEASE" List spring_boot =[ "org.springframework.boot:spring-boot-starter-web:$spring_boot_version", "org.springframework.boot:spring-boot-autoconfigure:$spring_boot_version", @@ -32,8 +32,7 @@ def spring_version="4.3.27.RELEASE" List spring =[ "org.springframework:spring-web:$spring_version", "org.springframework:spring-webmvc:$spring_version", - "org.springframework:spring-jdbc:$spring_version", - "org.springframework:spring-messaging:$spring_version", + "org.springframework:spring-jdbc:$spring_version" ] List mysql = [ @@ -83,8 +82,20 @@ List jackson = [ "com.fasterxml.jackson.datatype:jackson-datatype-jsr310:$jackson_version", ] + +// cover old version +def tomcat_version = "8.5.56" +List tomcat = [ + "org.apache.tomcat.embed:tomcat-embed-core:$tomcat_version", + "org.apache.tomcat.embed:tomcat-embed-el:$tomcat_version", + "org.apache.tomcat.embed:tomcat-embed-websocket:$tomcat_version", + "org.apache.tomcat:tomcat-jdbc:$tomcat_version", + "org.apache.tomcat:tomcat-juli:$tomcat_version", + "org.apache.tomcat:tomcat-annotations:$tomcat_version" +] + dependencies { - compile spring_boot,spring,mysql,swagger,log4j,dangdang,zookeeper,jaxb,jackson + compile spring_boot,spring,mysql,swagger,log4j,dangdang,zookeeper,jaxb,jackson,tomcat compile "org.fisco-bcos:web3sdk:2.4.1" // support guomi/ecdsa same time, support solcJ-0.5.2 compile "org.fisco-bcos:solcJ:0.4.25-rc1" From a0a9ec97fb4e5cc195ebd180b296dce0bfd5a87a Mon Sep 17 00:00:00 2001 From: CodingCattwo <847701726@qq.com> Date: Fri, 19 Jun 2020 17:45:36 +0800 Subject: [PATCH 7/7] upgrade tomcat springboot --- build.gradle | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/build.gradle b/build.gradle index 119e5a1..d994870 100644 --- a/build.gradle +++ b/build.gradle @@ -90,8 +90,7 @@ List tomcat = [ "org.apache.tomcat.embed:tomcat-embed-el:$tomcat_version", "org.apache.tomcat.embed:tomcat-embed-websocket:$tomcat_version", "org.apache.tomcat:tomcat-jdbc:$tomcat_version", - "org.apache.tomcat:tomcat-juli:$tomcat_version", - "org.apache.tomcat:tomcat-annotations:$tomcat_version" + "org.apache.tomcat:tomcat-juli:$tomcat_version" ] dependencies {