From 8d5e653d2bd3c785df945353a72d2699f99b3c71 Mon Sep 17 00:00:00 2001 From: yexuejc <1107047387@qq.com> Date: Wed, 20 Sep 2023 10:01:27 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0StrUtil.printStackTrace?= =?UTF-8?q?=E6=96=B9=E6=B3=95=EF=BC=9A=E6=8A=8A=E5=BC=82=E5=B8=B8=E5=A0=86?= =?UTF-8?q?=E6=A0=88=E4=BF=A1=E6=81=AF=E8=BD=AC=E5=8C=96=E4=B8=BA=E5=AD=97?= =?UTF-8?q?=E7=AC=A6=E4=B8=B2=20->=20=E6=9B=BF=E4=BB=A3=20e.printStackTrac?= =?UTF-8?q?e()?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/yexuejc/base/util/JsonUtil.java | 58 ++++--- .../java/com/yexuejc/base/util/StrUtil.java | 158 +++++++++++++----- 2 files changed, 154 insertions(+), 62 deletions(-) diff --git a/src/main/java/com/yexuejc/base/util/JsonUtil.java b/src/main/java/com/yexuejc/base/util/JsonUtil.java index 0dd77dc..d12edd3 100644 --- a/src/main/java/com/yexuejc/base/util/JsonUtil.java +++ b/src/main/java/com/yexuejc/base/util/JsonUtil.java @@ -6,11 +6,23 @@ import com.fasterxml.jackson.core.JsonParseException; import com.fasterxml.jackson.core.JsonParser; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.core.type.TypeReference; -import com.fasterxml.jackson.databind.*; +import com.fasterxml.jackson.databind.DeserializationFeature; +import com.fasterxml.jackson.databind.JavaType; +import com.fasterxml.jackson.databind.JsonMappingException; +import com.fasterxml.jackson.databind.JsonSerializer; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.PropertyNamingStrategies; +import com.fasterxml.jackson.databind.SerializationFeature; +import com.fasterxml.jackson.databind.SerializerProvider; import com.fasterxml.jackson.databind.json.JsonMapper; import com.fasterxml.jackson.databind.type.MapType; import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; -import com.yexuejc.base.converter.*; +import com.yexuejc.base.converter.LocalDateDeserializer; +import com.yexuejc.base.converter.LocalDateSerializer; +import com.yexuejc.base.converter.LocalDateTimeDeserializer; +import com.yexuejc.base.converter.LocalDateTimeSerializer; +import com.yexuejc.base.converter.TimestampDeserializer; +import com.yexuejc.base.converter.TimestampSerializer; import java.io.IOException; import java.io.InputStream; @@ -179,11 +191,11 @@ public class JsonUtil { try { pojo = jsonMapper.readValue(json, cls); } catch (JsonParseException e) { - log.warning("json to Object JsonParseException.\n" + e.getMessage()); + log.warning("json to Object JsonParseException.\n" + e); } catch (JsonMappingException e) { - log.warning("json to Object JsonMappingException.\n" + e.getMessage()); + log.warning("json to Object JsonMappingException.\n" + StrUtil.printStackTrace(e)); } catch (IOException e) { - log.warning("json to Object IOException.\n" + e.getMessage()); + log.warning("json to Object IOException.\n" + StrUtil.printStackTrace(e)); } return pojo; @@ -201,13 +213,13 @@ public class JsonUtil { try { pojo = jsonMapper.readValue(json, cls); } catch (JsonParseException e) { - log.warning("json to Object JsonParseException.\n" + e.getMessage()); + log.warning("json to Object JsonParseException.\n" + StrUtil.printStackTrace(e)); } catch (JsonMappingException e) { - log.warning("json to Object JsonMappingException.\n" + e.getMessage()); + log.warning("json to Object JsonMappingException.\n" + StrUtil.printStackTrace(e)); } catch (IOException e) { - log.warning("json to Object IOException.\n" + e.getMessage()); + log.warning("json to Object IOException.\n" + StrUtil.printStackTrace(e)); } catch (Exception e) { - e.printStackTrace(); + log.warning("json to Object Exception.\n" + StrUtil.printStackTrace(e)); } return pojo; @@ -227,11 +239,11 @@ public class JsonUtil { try { pojo = jsonMapper.readValue(json, javaType); } catch (JsonParseException e) { - log.warning("json to Object JsonParseException.\n" + e.getMessage()); + log.warning("json to Object JsonParseException.\n" + StrUtil.printStackTrace(e)); } catch (JsonMappingException e) { - log.warning("json to Object JsonMappingException.\n" + e.getMessage()); + log.warning("json to Object JsonMappingException.\n" + StrUtil.printStackTrace(e)); } catch (IOException e) { - log.warning("json to Object IOException.\n" + e.getMessage()); + log.warning("json to Object IOException.\n" + StrUtil.printStackTrace(e)); } return pojo; } @@ -252,11 +264,11 @@ public class JsonUtil { try { pojo = jsonMapper.readValue(json, mapType); } catch (JsonParseException e) { - log.warning("json to Object JsonParseException.\n" + e.getMessage()); + log.warning("json to Object JsonParseException.\n" + StrUtil.printStackTrace(e)); } catch (JsonMappingException e) { - log.warning("json to Object JsonMappingException.\n" + e.getMessage()); + log.warning("json to Object JsonMappingException.\n" + StrUtil.printStackTrace(e)); } catch (IOException e) { - log.warning("json to Object IOException.\n" + e.getMessage()); + log.warning("json to Object IOException.\n" + StrUtil.printStackTrace(e)); } return pojo; } @@ -273,7 +285,7 @@ public class JsonUtil { try { return jsonMapper.readValue(json, javaType); } catch (JsonProcessingException e) { - log.warning("json to Object JsonParseException.\n" + e.getMessage()); + log.warning("json to Object JsonParseException.\n" + StrUtil.printStackTrace(e)); } return null; } @@ -293,11 +305,11 @@ public class JsonUtil { try { pojo = jsonMapper.readValue(json, javaType); } catch (JsonParseException e) { - log.warning("json to Object JsonParseException.\n" + e.getMessage()); + log.warning("json to Object JsonParseException.\n" + StrUtil.printStackTrace(e)); } catch (JsonMappingException e) { - log.warning("json to Object JsonMappingException.\n" + e.getMessage()); + log.warning("json to Object JsonMappingException.\n" + StrUtil.printStackTrace(e)); } catch (IOException e) { - log.warning("json to Object IOException.\n" + e.getMessage()); + log.warning("json to Object IOException.\n" + StrUtil.printStackTrace(e)); } return pojo; } @@ -313,7 +325,7 @@ public class JsonUtil { try { json = jsonMapper.writeValueAsString(pojo); } catch (JsonProcessingException e) { - log.warning("json to Object JsonProcessingException.\n" + e.getMessage()); + log.warning("json to Object JsonProcessingException.\n" + StrUtil.printStackTrace(e)); } return json; } @@ -329,8 +341,12 @@ public class JsonUtil { try { json = jsonMapper.writerWithDefaultPrettyPrinter().writeValueAsString(obj); } catch (JsonProcessingException e) { - log.warning("json to Object JsonProcessingException.\n" + e.getMessage()); + log.warning("json to Object JsonProcessingException.\n" + StrUtil.printStackTrace(e)); } return json; } + + public static void main(String[] args) { + System.out.println(JsonUtil.json2Obj("adssad", StrUtil.class)); + } } \ No newline at end of file diff --git a/src/main/java/com/yexuejc/base/util/StrUtil.java b/src/main/java/com/yexuejc/base/util/StrUtil.java index 6cf384d..359d0e0 100644 --- a/src/main/java/com/yexuejc/base/util/StrUtil.java +++ b/src/main/java/com/yexuejc/base/util/StrUtil.java @@ -1,9 +1,20 @@ package com.yexuejc.base.util; import java.io.UnsupportedEncodingException; +import java.net.http.HttpClient; +import java.net.http.HttpRequest; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; -import java.util.*; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Random; +import java.util.UUID; +import java.util.concurrent.ExecutionException; +import java.util.function.Consumer; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -19,7 +30,7 @@ public final class StrUtil { private StrUtil() { } - public static char[] HEX_CHAR = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'}; + private static char[] HEX_CHAR = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'}; /** * 判断字符串,数组,集合 是否为空 @@ -111,40 +122,6 @@ public final class StrUtil { return num.append(String.format("%010d", hashCode)).toString().substring(0, 8); } - /** - * 解析aa=bb&cc=dd&ee=ff格式的字符串,返回HashMap - * - * @param urlencoded - * @return - */ - public static Map parseUrlencoded(String urlencoded) { - if (isEmpty(urlencoded)) { - return null; - } - String[] entrys = urlencoded.split("&"); - if (isEmpty(entrys)) { - return null; - } - - Map map = new HashMap(16); - String[] kv = null; - for (String entry : entrys) { - if (isEmpty(entry)) { - continue; - } - kv = entry.split("="); - if (isEmpty(kv)) { - continue; - } - if (kv.length > 1) { - map.put(kv[0], kv[1]); - } else { - map.put(kv[0], null); - } - } - return map; - } - /** * 字符串转换方法 把字节数组转换成16进制字符串 * @@ -254,8 +231,8 @@ public final class StrUtil { /** * 对ID(32位)进行编码 * - * @param id - * @return + * @param id 32位ID + * @return 编码后的64位ID */ public static String codeId(String id) { if (id == null || id.length() != 32) { @@ -282,8 +259,8 @@ public final class StrUtil { /** * 对ID(32位)进行解码 * - * @param coded - * @return + * @param coded 编码后的64位ID + * @return 解码后的32位ID */ public static String decodeId(String coded) { if (coded == null || coded.length() != 64) { @@ -297,6 +274,40 @@ public final class StrUtil { return id.toString(); } + /** + * 解析aa=bb&cc=dd&ee=ff格式的字符串,返回HashMap + * + * @param urlencoded + * @return + */ + public static Map parseUrlencoded(String urlencoded) { + if (isEmpty(urlencoded)) { + return null; + } + String[] entrys = urlencoded.split("&"); + if (isEmpty(entrys)) { + return null; + } + + Map map = new HashMap(16); + String[] kv = null; + for (String entry : entrys) { + if (isEmpty(entry)) { + continue; + } + kv = entry.split("="); + if (isEmpty(kv)) { + continue; + } + if (kv.length > 1) { + map.put(kv[0], kv[1]); + } else { + map.put(kv[0], null); + } + } + return map; + } + /** * map parameters 转url parameters * @@ -370,7 +381,7 @@ public final class StrUtil { /** * 下划线字符 */ - public static final char UNDERLINE = '_'; + private static final char UNDERLINE = '_'; /** * 字符串下划线转驼峰格式 @@ -419,4 +430,69 @@ public final class StrUtil { } return sb.toString(); } + + private static final String NEW_LINE = "\n"; + private static final String ERROR_MESSAGE_FORMAT = "%s.%s(%s:%d)"; + + /** + * 把异常堆栈信息转化为字符串,同时把所有的errorMessage用\n方式拼接到printStackTrace前面 -> 替代 e.printStackTrace() + *

使用e.printStackTrace()不能作为字符串处理,本方法可以转换e.printStackTrace()为字符串

+ *

printStackTrace信息从Caused by:C开始

+ * + * @param cause + * @return + */ + public static String printStackTraceAndMessage(Throwable cause) { + if (cause != null) { + StringBuilder msg = new StringBuilder(); + if (isNotEmpty(cause.getMessage())) { + msg.append(cause.getMessage()).append(NEW_LINE); + } + String causedMsg = printStackTrace(cause, (eMessage) -> { + if (isNotEmpty(eMessage)) { + msg.append(eMessage).append(NEW_LINE); + } + }); + return msg.append(causedMsg).toString(); + } + return ""; + } + + /** + * 把异常堆栈信息转化为字符串 -> 替代 e.printStackTrace() + *

使用e.printStackTrace()不能作为字符串处理,本方法可以转换e.printStackTrace()为字符串

+ * + * @param cause + * @return + */ + public static String printStackTrace(Throwable cause) { + return printStackTrace(cause, (eMessage) -> { + }); + } + + private static String printStackTrace(Throwable cause, Consumer consumer) { + if (cause != null) { + StringBuilder sb = new StringBuilder(); + String cClass = cause.getClass().getName(); + String eMessage = cause.getMessage(); + StackTraceElement[] stackTrace = cause.getStackTrace(); + Throwable caused = cause.getCause(); + while (caused != null) { + cClass = caused.getClass().getName(); + eMessage = caused.getMessage(); + stackTrace = caused.getStackTrace(); + caused = caused.getCause(); + consumer.accept(eMessage); + } + sb.append("Caused by: ").append(cClass).append(": ").append(eMessage).append(NEW_LINE); + for (StackTraceElement element : stackTrace) { + sb.append("\tat "); + sb.append(String.format(ERROR_MESSAGE_FORMAT, element.getClassName(), element.getMethodName(), + element.getFileName(), element.getLineNumber())); + sb.append(NEW_LINE); + } + return sb.toString(); + } + return ""; + } }