900字范文,内容丰富有趣,生活中的好帮手!
900字范文 > SpringBoot(13) - - SpringBoot 自定义异常处理

SpringBoot(13) - - SpringBoot 自定义异常处理

时间:2020-04-25 19:56:29

相关推荐

SpringBoot(13) - - SpringBoot 自定义异常处理

项目路径:/zhaopeng01/springboot-study/tree/master/study_13

序言

在代码中使用自定义的异常类,可以结合自己的项目对异常进行统一的封装处理,进行封装管理,使得整个项目的异常处理更规范、更统一、更优雅。同时,使得日志的记录上更加清晰,便于后续查日志定位问题。

所以这篇文章就来写一下自定义异常的处理方式,都是根据自己的个人的一些想法去写的

依赖

<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>mons</groupId><artifactId>commons-lang3</artifactId><version>3.7</version></dependency><dependency><groupId>com.googlecode.libphonenumber</groupId><artifactId>libphonenumber</artifactId><version>8.9.13</version></dependency></dependencies>

常用校验方法

把一些常用的校验方法放到了一起,算是一种整合吧,感觉能用到的都放进去了,再有继续补充

/*** Assertion utility class that assists in validating arguments.**/public abstract class Assert {private static String getMessage(String key, Object... args) {return Resources.getMessage(key, args);}/** */public static void isTrue(boolean expression, String key) {if (!expression) {throw new IllegalArgumentException(getMessage(key));}}/** */public static void isNull(Object object, String key) {if (object != null) {throw new IllegalArgumentException(getMessage(key));}}/*** (key_IS_NULL)*/public static void notNull(Object object, String key, Object... args) {if (object == null) {throw new IllegalArgumentException(getMessage(key + "_IS_NULL", args));}}/** */public static void hasLength(String text, String key) {if (StringUtils.isEmpty(text)) {throw new IllegalArgumentException(getMessage(key));}}/** */public static void hasText(String text, String key) {if (StringUtils.isBlank(text)) {throw new IllegalArgumentException(getMessage(key));}}/** */public static void doesNotContain(String textToSearch, String substring, String key) {if (StringUtils.isNotBlank(textToSearch) && StringUtils.isNotBlank(substring)&& textToSearch.contains(substring)) {throw new IllegalArgumentException(getMessage(key));}}/** */public static void notEmpty(Object[] array, String key, Object... args) {if (ObjectUtils.isEmpty(array)) {throw new IllegalArgumentException(getMessage(key + "_IS_EMPTY", args));}}/** */public static void noNullElements(Object[] array, String key) {if (array != null) {for (Object element : array) {if (element == null) {throw new IllegalArgumentException(getMessage(key));}}}}/** */public static void notEmpty(Collection<?> collection, String key) {if (CollectionUtils.isEmpty(collection)) {throw new IllegalArgumentException(getMessage(key));}}/** */public static void notEmpty(Map<?, ?> map, String key) {if (CollectionUtils.isEmpty(map)) {throw new IllegalArgumentException(getMessage(key));}}/** */public static void isInstanceOf(Class<?> type, Object obj, String key) {notNull(type, key);if (!type.isInstance(obj)) {throw new IllegalArgumentException(getMessage(key));}}/** */public static void isAssignable(Class<?> superType, Class<?> subType, String key) {notNull(superType, key);if (subType == null || !superType.isAssignableFrom(subType)) {throw new IllegalArgumentException(getMessage(key));}}/*** 空字符或NULL*/public static void isBlank(String text, String key) {if (StringUtils.isNotBlank(text)) {throw new IllegalArgumentException(getMessage(key));}}/*** 非空字符串(key_IS_NULL)*/public static void isNotBlank(String text, String key) {if (StringUtils.isBlank(text)) {throw new IllegalArgumentException(getMessage(key + "_IS_NULL"));}}/*** 允许最小值*/public static void min(Integer value, Integer min, String key) {notNull(value, key);if (value < min) {throw new IllegalArgumentException(getMessage(key + "_MIN", min));}}/*** 允许最大值*/public static void max(Integer value, Integer max, String key) {notNull(value, key);if (value > max) {throw new IllegalArgumentException(getMessage(key + "_MAX", max));}}/*** 允许值范围*/public static void range(Integer value, Integer min, Integer max, String key) {min(value, min, key);max(value, max, key);}/*** 允许最小值*/public static void min(Float value, Float min, String key) {notNull(value, key);if (value < min) {throw new IllegalArgumentException(getMessage(key + "_MIN", min));}}/*** 允许最大值*/public static void max(Float value, Float max, String key) {notNull(value, key);if (value > max) {throw new IllegalArgumentException(getMessage(key + "_MAX", max));}}/*** 允许值范围*/public static void range(Float value, Float min, Float max, String key) {min(value, min, key);max(value, max, key);}/*** 允许最小值*/public static void min(Double value, Double min, String key) {notNull(value, key);if (value < min) {throw new IllegalArgumentException(getMessage(key + "_MIN", min));}}/*** 允许最大值*/public static void max(Double value, Double max, String key) {notNull(value, key);if (value > max) {throw new IllegalArgumentException(getMessage(key + "_MAX", max));}}/*** 允许值范围*/public static void range(Double value, Double min, Double max, String key) {min(value, min, key);max(value, max, key);}/*** 字符长度(key_LENGTH)*/public static void length(String text, Integer min, Integer max, String key) {notNull(text, key);if (min != null && text.length() < min) {throw new IllegalArgumentException(getMessage(key + "_LENGTH", min, max));}if (max != null && text.length() > max) {throw new IllegalArgumentException(getMessage(key + "_LENGTH", min, max));}}/*** 未来某一天*/public static void future(Date date, String key) {if (date != null && pareTo(new Date()) <= 0) {throw new IllegalArgumentException(getMessage(key + "_NOT_FUTURE"));}}/*** 身份证*/public static void idCard(String text) {if (!IDCardUtil.isIdentity(text)) {throw new IllegalArgumentException(getMessage("IDCARD_ILLEGAL"));}}/*** 邮箱*/public static void email(String text) {String regex = "^([a-z0-9A-Z]+[-|_|\\.]?)+[a-z0-9A-Z]@([a-z0-9A-Z]+(-[a-z0-9A-Z]+)?\\.)+[a-zA-Z]{2,}$";pattern(text, regex, true, "EMAIL");}/*** 手机号*/public static void mobile(String text) {String regex = "((^(13|15|17|18)[0-9]{9}$)|(^0[1,2]{1}\\d{1}-?\\d{8}$)|(^0[3-9] {1}\\d{2}-?\\d{7,8}$)|(^0[1,2]{1}\\d{1}-?\\d{8}-(\\d{1,4})$)|(^0[3-9]{1}\\d{2}-? \\d{7,8}-(\\d{1,4})$))";pattern(text, regex, true, "MOBILE");}/*** 正则表达式*/public static void pattern(String text, String regex, boolean flag, String key) {boolean result = false;try {Pattern pattern = pile(regex);Matcher matcher = pattern.matcher(text);result = matcher.matches();} catch (Exception e) {result = false;}if (result != flag) {throw new IllegalArgumentException(getMessage(key + "_ILLEGAL"));}}/*** 邮箱*/public static String password(String password) {password = password.trim();pattern(password, "(?![0-9]+)([A-Za-z0-9]{8,16})", true, "PASSWORD");return password;}public static String userName(String userName) {userName = userName.trim();if (userName.length() > 7) {throw new IllegalArgumentException(getMessage("USER_NAME_ILLEGAL"));}return userName;}public static String userInfo(String userInfo) {userInfo = userInfo.trim();if (userInfo.length() > 150) {throw new IllegalArgumentException(getMessage("USER_INFO_ILLEGAL"));}return userInfo;}public static String payPassword(String password) {password = password.trim();pattern(password, "[0-9]{6}", true, "PAY_PASSWORD");return password;}public static void confirmTheCurrentRole(Integer currentRole, Integer actualRole) {if (!currentRole.equals(actualRole)) {throw new IllegalArgumentException(getMessage("INCONSISTENT_CURRENT_ROLE"));}}/*** 手机号*/public static String phone(String phone) {Assert.isNotBlank(phone, "PHONE");phone = phone.trim();PhoneNumberUtil phoneNumberUtil = PhoneNumberUtil.getInstance();Phonenumber.PhoneNumber phoneNumber = new Phonenumber.PhoneNumber();phoneNumber.setCountryCode(86);phoneNumber.setNationalNumber(Long.valueOf(phone));Assert.isTrue(phoneNumberUtil.isValidNumber(phoneNumber), "PHONE_FORMAT_ERROR");return phone;}/*** 身份证号码验证 1、号码的结构 公民身份号码是特征组合码,由十七位数字本体码和一位校验码组成。排列顺序从左至右依次为:六位数字地址码,* 八位数字出生日期码,三位数字顺序码和一位数字校验码。 2、地址码(前六位数)* 表示编码对象常住户口所在县(市、旗、区)的行政区划代码,按GB/T2260的规定执行。 3、出生日期码(第七位至十四位)* 表示编码对象出生的年、月、日,按GB/T7408的规定执行,年、月、日代码之间不用分隔符。 4、顺序码(第十五位至十七位)* 表示在同一地址码所标识的区域范围内,对同年、同月、同日出生的人编定的顺序号, 顺序码的奇数分配给男性,偶数分配给女性。 5、校验码(第十八位数)* (1)十七位数字本体码加权求和公式 S = Sum(Ai * Wi), i = 0, ... , 16 ,先对前17位数字的权求和* Ai:表示第i位置上的身份证号码数字值 Wi:表示第i位置上的加权因子 Wi: 7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4* 2 (2)计算模 Y = mod(S, 11) (3)通过模得到对应的校验码 Y: 0 1 2 3 4 5 6 7 8 9 10 校验码: 1 0* X 9 8 7 6 5 4 3 2*//*** 功能:身份证的有效验证** @param idCard 身份证号* @return 有效:返回"" 无效:返回String信息*/public static String validateIDCard(String idCard) {idCard = idCard.trim();validateIDCardLength(idCard);validateIDCardDate(idCard);validateIDCardAreaCode(idCard);validateIDCardVerifyCode(idCard);return idCard;}private static void validateIDCardLength(String idCard) {// ================ 号码的长度 15位或18位 ================if (idCard.length() != 15 && idCard.length() != 18) {idCardInvalid();}}private static void validateIDCardDate(String idCard) {String dateStr;if (idCard.length() == 15) {dateStr = idCard.substring(0, 6) + "19" + idCard.substring(6, 15);} else {dateStr = idCard.substring(0, 17);}try {LocalDate.of(Integer.valueOf(dateStr.substring(6, 10)),Integer.valueOf(dateStr.substring(10, 12)),Integer.valueOf(dateStr.substring(12, 14)));} catch (Exception e) {idCardInvalid();}}private static void validateIDCardAreaCode(String idCard) {Map<String, String> areaMap = areaCode();if (areaMap.get(idCard.substring(0, 2)) == null) {// 身份证地区编码错误idCardInvalid();}}private static void validateIDCardVerifyCode(String idCard) {if (Objects.equals(15, idCard.length())) {return;}String[] ValCodeArr = {"1", "0", "X", "9", "8", "7", "6", "5", "4","3", "2"};String[] Wi = {"7", "9", "10", "5", "8", "4", "2", "1", "6", "3", "7","9", "10", "5", "8", "4", "2"};// ================ 判断最后一位的值 ================int TotalmulAiWi = 0;for (int i = 0; i < 17; i++) {TotalmulAiWi = TotalmulAiWi+ Integer.parseInt(String.valueOf(idCard.charAt(i)))* Integer.parseInt(Wi[i]);}int modValue = TotalmulAiWi % 11;// 大写的罗马数字表示10if (!Objects.equals(String.valueOf(idCard.charAt(17)).toUpperCase(), ValCodeArr[modValue])) {// 身份证无效,不是合法的身份证号码idCardInvalid();}}/*** 功能:设置地区编码** @return Hashtable 对象*/private static Map<String, String> areaCode() {Map<String, String> areaMap = new HashMap<>();areaMap.put("11", "北京");areaMap.put("12", "天津");areaMap.put("13", "河北");areaMap.put("14", "山西");areaMap.put("15", "内蒙古");areaMap.put("21", "辽宁");areaMap.put("22", "吉林");areaMap.put("23", "黑龙江");areaMap.put("31", "上海");areaMap.put("32", "江苏");areaMap.put("33", "浙江");areaMap.put("34", "安徽");areaMap.put("35", "福建");areaMap.put("36", "江西");areaMap.put("37", "山东");areaMap.put("41", "河南");areaMap.put("42", "湖北");areaMap.put("43", "湖南");areaMap.put("44", "广东");areaMap.put("45", "广西");areaMap.put("46", "海南");areaMap.put("50", "重庆");areaMap.put("51", "四川");areaMap.put("52", "贵州");areaMap.put("53", "云南");areaMap.put("54", "西藏");areaMap.put("61", "陕西");areaMap.put("62", "甘肃");areaMap.put("63", "青海");areaMap.put("64", "宁夏");areaMap.put("65", "新疆");areaMap.put("71", "台湾");areaMap.put("81", "香港");areaMap.put("82", "澳门");areaMap.put("91", "国外");return areaMap;}private static void idCardInvalid() {throw new IllegalArgumentException(getMessage("INVALID_ID_CARD"));}public static void verification(Map verification) {if (verification.size() == 1) {throw new IllegalArgumentException(getMessage("VERIFICATION_IS_ERROR"));}}public static void birthDay(String birthDay) {try {LocalDate.parse(birthDay);} catch (Exception e) {throw new IllegalArgumentException(getMessage("BIRTHDAY_ILLEGAL"));}}public static String nickName(String userName) {userName = userName.trim();if (userName.length() > 7) {throw new IllegalArgumentException(getMessage("NICK_NAME_ILLEGAL"));}return userName;}}

HttpCode

请求时的自定义查询状态码,主要参考Http状态码,但并不完全对应

/*** Ajax 请求时的自定义查询状态码,主要参考Http状态码,但并不完全对应** @author zhaopeng* @email zp152527@*/public enum HttpCode {/*** 200请求成功*/OK(200),/*** 207频繁操作*/MULTI_STATUS(207),/*** 400请求参数出错*/BAD_REQUEST(400),/*** 401没有登录*/UNAUTHORIZED(401),/*** 402登录失败*/LOGIN_FAIL(402),/*** 403没有权限*/FORBIDDEN(403),/*** 404找不到页面*/NOT_FOUND(404),/*** 405请求方法不能被用于请求相应的资源*/METHOD_NOT_ALLOWED(405),/*** 406内容特性不满足*/NOT_ACCEPTABLE(406),/*** 408请求超时*/REQUEST_TIMEOUT(408),/*** 409发生冲突*/CONFLICT(409),/*** 410已被删除*/GONE(410),/*** 411没有定义长度*/LENGTH_REQUIRED(411),/*** 412条件不满足*/PRECONDITION_FAILED(412),/*** 413数据太大*/ENTITY_TOO_LARGE(413),/*** 415不是服务器中所支持的格式*/UNSUPPORTED_MEDIA_TYPE(415),/*** 421连接数过多*/TOO_MANY_CONNECTIONS(421),/*** 423已被锁定*/LOCKED(423),/*** 451法律不允许*/UNAVAILABLE_LEGAL(451),/*** 500服务器出错*/INTERNAL_SERVER_ERROR(500),/*** 501不支持当前请求所需要的某个功能*/NOT_IMPLEMENTED(501),/*** 503服务器升级中,暂时不可用*/SERVICE_UNAVAILABLE(503),/*** 501获取资源所需要的策略并没有被满足*/NOT_EXTENDED(510);private final Integer value;private HttpCode(Integer value) {this.value = value;}/*** Return the integer value of this status code.*/public Integer value() {return this.value;}public String msg() {return Resources.getMessage("HTTPCODE_" + this.value);}public String toString() {return this.value.toString();}}

加载配置

package mon;import java.util.HashMap;import java.util.Locale;import java.util.Map;import java.util.ResourceBundle;import org.springframework.context.i18n.LocaleContextHolder;/*** 加载配置** @author zhaopeng* @email zp152527@*/public final class Resources {/*** 国际化信息*/private static final Map<String, ResourceBundle> MESSAGES = new HashMap<String, ResourceBundle>();/*** 国际化信息*/public static String getMessage(String key, Object... params) {Locale locale = LocaleContextHolder.getLocale();ResourceBundle message = MESSAGES.get(locale.getLanguage());if (message == null) {synchronized (MESSAGES) {message = MESSAGES.get(locale.getLanguage());if (message == null) {message = ResourceBundle.getBundle("i18n/messages", locale);MESSAGES.put(locale.getLanguage(), message);}}}if (params != null && params.length > 0) {return String.format(message.getString(key), params);}return message.getString(key);}/*** 清除国际化信息*/public static void flushMessage() {MESSAGES.clear();}}

配置文件地址

地址在i18n/messages这里 这里篇幅原因只写出一个

messages_zh.properties

#\u56fd\u9645\u5316\u4fe1\u606fHTTPCODE_200=\u8bf7\u6c42\u6210\u529fHTTPCODE_207=\u8bf7\u52ff\u91cd\u590d\u64cd\u4f5cHTTPCODE_303=\u5e10\u53f7\u6216\u5bc6\u7801\u9519\u8befHTTPCODE_400=\u60a8\u8bf7\u6c42\u7684\u53c2\u6570\u9519\u8befHTTPCODE_401=\u60a8\u8fd8\u6ca1\u6709\u767b\u5f55HTTPCODE_402=\u5e10\u53f7\u6216\u5bc6\u7801\u9519\u8befHTTPCODE_403=\u60a8\u6ca1\u6709\u6743\u9650\u8fdb\u884c\u8be5\u64cd\u4f5cHTTPCODE_404=\u627e\u4e0d\u5230\u60a8\u8bf7\u6c42\u7684\u8d44\u6e90HTTPCODE_406=\u5185\u5bb9\u7279\u6027\u4e0d\u6ee1\u8db3HTTPCODE_408=\u8bf7\u6c42\u8d85\u65f6HTTPCODE_409=\u53d1\u751f\u51b2\u7a81HTTPCODE_410=\u60a8\u8bf7\u6c42\u7684\u8d44\u6e90\u5df2\u88ab\u5220\u9664HTTPCODE_423=\u60a8\u8bf7\u6c42\u7684\u8d44\u6e90\u5df2\u88ab\u9501\u5b9aHTTPCODE_500=\u670d\u52a1\u5668\u51fa\u9519\uff0c\u8bf7\u60a8\u8054\u7cfb\u7ba1\u7406\u5458EMAIL.SET_HOST=\u8bbe\u7f6e\u7cfb\u7edf\u5c5e\u6027\uff1amail.smtp.host=%sEMAIL.PRE_TALK=\u51c6\u5907\u83b7\u53d6\u90ae\u4ef6\u4f1a\u8bdd\u5bf9\u8c61\uff01EMAIL.ERROR_TALK=\u83b7\u53d6\u90ae\u4ef6\u4f1a\u8bdd\u5bf9\u8c61\u65f6\u53d1\u751f\u9519\u8bef\uff01EMAIL.PRE_MIME=\u51c6\u5907\u521b\u5efaMIME\u90ae\u4ef6\u5bf9\u8c61\uff01EMAIL.ERROR_MIME=\u521b\u5efaMIME\u90ae\u4ef6\u5bf9\u8c61\u5931\u8d25\uff01EMAIL.SET_AUTH=\u8bbe\u7f6esmtp\u8eab\u4efd\u8ba4\u8bc1\uff1amail.smtp.auth=%sEMAIL.SET_SUBJECT=\u8bbe\u7f6e\u90ae\u4ef6\u4e3b\u9898[%s]\uff01EMAIL.ERROR_SUBJECT=\u8bbe\u7f6e\u90ae\u4ef6\u4e3b\u9898\u53d1\u751f\u9519\u8bef\uff01EMAIL.ERROR_BODY=\u8bbe\u7f6e\u90ae\u4ef6\u6b63\u6587\u65f6\u53d1\u751f\u9519\u8bef\uff01EMAIL.ADD_ATTEND=\u589e\u52a0\u90ae\u4ef6\u9644\u4ef6[%s]\uff01EMAIL.SET_TO=\u8bbe\u7f6e\u6536\u4fe1\u4eba[%s]\uff01EMAIL.SET_COPYTO=\u8bbe\u7f6e\u6284\u9001\u4eba[%s]\uff01EMAIL.SENDING=\u6b63\u5728\u53d1\u9001\u90ae\u4ef6....EMAIL.SEND_SUCC=\u53d1\u9001\u90ae\u4ef6\u6210\u529f\uff01EMAIL.SEND_ERR=\u90ae\u4ef6\u53d1\u9001\u5931\u8d25\uff01THIRDPARTY.LOGIN.NOTOKEN=\u672a\u83b7\u53d6\u5230%s\u767b\u5f55\u4ee4\u724c\uff01IDCARD_ILLEGAL=\u8eab\u4efd\u8bc1\u53f7\u7801\u9519\u8bef.EMAIL_ILLEGAL=\u90ae\u7bb1\u683c\u5f0f\u9519\u8bef.MOBILE_ILLEGAL=\u624b\u673a\u53f7\u683c\u5f0f\u9519\u8bef.TASKID_IS_NULL=\u5b9a\u65f6\u4efb\u52a1Id\u4e0d\u80fd\u4e3a\u7a7a.LOGIN_FAIL=\u7528\u6237\u540d\u6216\u5bc6\u7801\u9519\u8bef.ACCOUNT_IS_NULL=\u5e10\u53f7\u4e0d\u80fd\u4e3a\u7a7a.ACCOUNT_LENGTH=\u5e10\u53f7\u5141\u8bb8\u957f\u5ea6\u8303\u56f4%s-%s.PASSWORD_IS_NULL=\u5bc6\u7801\u4e0d\u80fd\u4e3a\u7a7a.PASSWORD_LENGTH=\u5e10\u53f7\u5141\u8bb8\u957f\u5ea6\u8303\u56f4%s-%s.OLDPASSWORD_IS_NULL=\u539f\u5bc6\u7801\u4e0d\u80fd\u4e3a\u7a7a.USER_ID_IS_NULL=\u7528\u6237ID\u4e0d\u80fd\u4e3a\u7a7a.USER_IS_NULL=\u7528\u6237Id[%s]\u9519\u8bef.ID_IS_NULL=Id\u4e0d\u80fd\u4e3a\u7a7a.TASKGROUP_IS_NULL=\u4efb\u52a1\u7ec4\u540d\u79f0\u4e0d\u80fd\u4e3a\u7a7a.TASKNAME_IS_NULL=\u4efb\u52a1\u540d\u79f0\u4e0d\u80fd\u4e3a\u7a7a.JOBTYPE_IS_NULL=\u4efb\u52a1\u6267\u884c\u7c7b\u578b\u4e0d\u80fd\u4e3a\u7a7a.TASKTYPE_IS_NULL=\u4efb\u52a1\u6267\u884c\u5668\u7c7b\u578b\u4e0d\u80fd\u4e3a\u7a7a.TARGETOBJECT_IS_NULL=\u4efb\u52a1\u8fd0\u884c\u5bf9\u8c61\u4e0d\u80fd\u4e3a\u7a7a.TARGETMETHOD_IS_NULL=\u4efb\u52a1\u8fd0\u884c\u65b9\u6cd5\u4e0d\u80fd\u4e3a\u7a7a.TARGETSYSTEM_IS_NULL=\u4efb\u52a1\u6267\u884c\u7cfb\u7edf\u4e0d\u80fd\u4e3a\u7a7a.PHONE_IS_NULL=\u624b\u673a\u53f7\u4e3a\u7a7aPHONE_FORMAT_ERROR=\u624b\u673a\u53f7\u975e\u6cd5PHONE_HAS_BEEN_BOUND=\u624b\u673a\u53f7\u5df2\u88ab\u7ed1\u5b9aPASSWORD_ILLEGAL=\u5bc6\u7801\u683c\u5f0f\u9519\u8befCODE_IS_NULL=\u9a8c\u8bc1\u7801\u4e0d\u80fd\u4e3a\u7a7aCODE_NOT_EQUAL= \u9a8c\u8bc1\u7801\u4e0d\u5339\u914dPHONE_NOT_EXIST= \u7528\u6237\u4e0d\u5b58\u5728\u8bf7\u6ce8\u518cPASSWORD_NOT_MATCH=\u7528\u6237\u548c\u5bc6\u7801\u4e0d\u5339\u914dCODE_TIME_OUT= \u9a8c\u8bc1\u7801\u8d85\u65f6\uff0c\u8bf7\u4ece\u65b0\u83b7\u53d6ROLE_IS_NULL= \u7528\u6237\u89d2\u8272\u4e0d\u80fd\u4e3a\u7a7aPARAM_IS_NULL=��\u53c2\u6570\u9519\u8befREGISTER_CODE_COUNT_OUT= \u8d85\u8fc7\u5f53\u65e5\u83b7\u53d6\u77ed\u4fe1\u6570\u91cf\u9650\u5236

Util

/*** 身份证验证辅助类* * @since -11-08*/public final class IDCardUtil {private IDCardUtil() {}/** 大陆地区地域编码最大值 **/public static final int MAX_MAINLAND_AREACODE = 659004;/** 大陆地区地域编码最小值 **/public static final int MIN_MAINLAND_AREACODE = 110000;/** 香港地域编码值 **/public static final int HONGKONG_AREACODE = 810000; // 香港地域编码值/** 台湾地域编码值 **/public static final int TAIWAN_AREACODE = 710000;/** 澳门地域编码值 **/public static final int MACAO_AREACODE = 820000;/** 数字正则 **/public static final String regexNum = "^[0-9]*$";/** 闰年生日正则 **/public static final String regexBirthdayInLeapYear = "^((19[0-9]{2})|(200[0-9])|(201[0-5]))((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|[1-2][0-9]))$";/** 平年生日正则 **/public static final String regexBirthdayInCommonYear = "^((19[0-9]{2})|(200[0-9])|(201[0-5]))((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|1[0-9]|2[0-8]))$";@SuppressWarnings("serial")private static final Set<String> BLACK_SET = new HashSet<String>() {{add("111111111111111");}};/*** <p>* 身份证格式强校验* </p>* <p>* 身份证号码验证 1、号码的结构 公民身份号码是特征组合码,由十七位数字本体码和一位校验码组成。排列顺序从左至右依次为:六位数字地址码, 八位数字出生日期码,三位数字顺序码和一位数字校验码。 2、地址码(前六位数)* 表示编码对象常住户口所在县(市、旗、区)的行政区划代码,按GB/T2260的规定执行。 3、出生日期码(第七位至十四位) 表示编码对象出生的年、月、日,按GB/T7408的规定执行,年、月、日代码之间不用分隔符。* 4、顺序码(第十五位至十七位) 表示在同一地址码所标识的区域范围内,对同年、同月、同日出生的人编定的顺序号, 顺序码的奇数分配给男性,偶数分配给女性。 5、校验码(第十八位数) (1)十七位数字本体码加权求和公式 S =* Sum(Ai * Wi), i = 0, ... , 16 ,先对前17位数字的权求和 Ai:表示第i位置上的身份证号码数字值 Wi:表示第i位置上的加权因子 Wi: 7 9 10 5 8 4 2 1 6 3 7 9 10 5* 8 4 2 (2)计算模 Y = mod(S, 11) (3)通过模得到对应的校验码 Y: 0 1 2 3 4 5 6 7 8 9 10 校验码: 1 0 X 9 8 7 6 5 4 3 2* </p>*/public static final boolean isIdentity(String idNumber) {if (StringUtils.isBlank(idNumber)) {return false;}idNumber = idNumber.trim();if (BLACK_SET.contains(idNumber)) {return false;}if (!checkIdNumberRegex(idNumber)) {return false;}if (!checkIdNumberArea(idNumber.substring(0, 6))) {return false;}idNumber = convertFifteenToEighteen(idNumber);if (!checkBirthday(idNumber.substring(6, 14))) {return false;}if (!checkIdNumberVerifyCode(idNumber)) {return false;}return true;}/*** 从身份证号中获取出生日期,身份证号可以为15位或18位* * @param identity 身份证号* @return 出生日期* @throws Throwable 身份证号出生日期段有误*/public static final Timestamp getBirthdayFromPersonIDCode(String identity) throws Throwable {String id = getIDCode(identity);SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");try {Timestamp birthday = new Timestamp(sdf.parse(id.substring(6, 14)).getTime());return birthday;} catch (ParseException e) {throw new RuntimeException("不是有效的身份证号,请检查");}}/*** 将传入的身份证号码进行校验,并返回一个对应的18位身份证* * @param idCode 身份证号码* @return String 十八位身份证号码* @throws Throwable 无效的身份证号*/public static final String getIDCode(String idCode) throws Throwable {if (idCode == null) throw new RuntimeException("输入的身份证号无效,请检查");if (idCode.length() == 18) {if (isIdentity(idCode)) return idCode;else throw new RuntimeException("输入的身份证号无效,请检查");} else if (idCode.length() == 15) return convertFifteenToEighteen(idCode);else throw new RuntimeException("输入的身份证号无效,请检查");}/*** 从身份证号获取性别* * @param identity 身份证号* @return 性别代码* @throws Throwable 无效的身份证号码*/public static final Sex getGenderFromPersonIDCode(String identity) throws Throwable {String id = getIDCode(identity);char sex = id.charAt(16);return sex % 2 == 0 ? Sex.Female : Sex.Male;}/*** 身份证正则校验*/private static boolean checkIdNumberRegex(String idNumber) {return Pattern.matches("^([0-9]{17}[0-9Xx])|([0-9]{15})$", idNumber);}/*** 身份证地区码检查*/private static boolean checkIdNumberArea(String idNumberArea) {int areaCode = Integer.parseInt(idNumberArea);if (areaCode == HONGKONG_AREACODE || areaCode == MACAO_AREACODE || areaCode == TAIWAN_AREACODE) {return true;}if (areaCode <= MAX_MAINLAND_AREACODE && areaCode >= MIN_MAINLAND_AREACODE) {return true;}return false;}/*** 将15位身份证转换为18位*/private static String convertFifteenToEighteen(String idNumber) {if (15 != idNumber.length()) {return idNumber;}idNumber = idNumber.substring(0, 6) + "19" + idNumber.substring(6, 15);idNumber = idNumber + getVerifyCode(idNumber);return idNumber;}static final char[] code = {'1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'}; // 11个校验码字符static final int[] factor = {7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2, 1}; // 18个加权因子/*** 根据身份证前17位计算身份证校验码*/private static String getVerifyCode(String idNumber) {if (!Pattern.matches(regexNum, idNumber.substring(0, 17))) {return null;}int sum = 0;for (int i = 0; i < 17; i++) {sum = sum + Integer.parseInt(String.valueOf(idNumber.charAt(i))) * factor[i];}return String.valueOf(code[sum % 11]);}/*** 身份证出生日期嘛检查*/private static boolean checkBirthday(String idNumberBirthdayStr) {Integer year = null;try {year = Integer.valueOf(idNumberBirthdayStr.substring(0, 4));} catch (Exception e) {}if (null == year) {return false;}if (isLeapYear(year)) {return Pattern.matches(regexBirthdayInLeapYear, idNumberBirthdayStr);} else {return Pattern.matches(regexBirthdayInCommonYear, idNumberBirthdayStr);}}/*** 判断是否为闰年*/private static boolean isLeapYear(int year) {return (year % 400 == 0) || (year % 100 != 0 && year % 4 == 0);}/*** 身份证校验码检查*/private static boolean checkIdNumberVerifyCode(String idNumber) {return getVerifyCode(idNumber).equalsIgnoreCase(idNumber.substring(17));}public static void main(String[] args) throws Throwable {System.out.println(IDCardUtil.getGenderFromPersonIDCode("11010519491231002X"));System.out.println(IDCardUtil.isIdentity("530626199109261396"));}/*** 性别* */public enum Sex {/*** 未知*/Other("未知", 0),/*** 男*/Male("男", 1),/*** 女*/Female("女", 2);private String name;private Integer value;private Sex(String name, Integer value) {this.name = name;this.value = value;}public Integer getValue() {return value;}public String toString() {return this.name;}}}

测试Controller

根据常用校验方法来搞一下

package com.zyc.controller;import mon.Assert;import mons.lang3.StringUtils;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController;@RestControllerpublic class ExceptionDemoController {private static final String ID_NUM = null;@RequestMapping("/get")public String getName() {Assert.notNull(ID_NUM, "ID");return "id :" + ID_NUM + "author is zyc";}}

结果

-12-15 22:32:54.807 ERROR 7353 --- [nio-8080-exec-3] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is java.lang.IllegalArgumentException: Id不能为空.] with root causejava.lang.IllegalArgumentException: Id不能为空.at mon.Assert.notNull(Assert.java:43) ~[classes/:na]at com.zyc.controller.ExceptionDemoController.getName(ExceptionDemoController.java:16) ~[classes/:na]at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_191]at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_191]at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_191]at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_191]at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:189) ~[spring-web-5.1.3.RELEASE.jar:5.1.3.RELEASE]at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:138) ~[spring-web-5.1.3.RELEASE.jar:5.1.3.RELEASE]at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:102) ~[spring-webmvc-5.1.3.RELEASE.jar:5.1.3.RELEASE]at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:895) ~[spring-webmvc-5.1.3.RELEASE.jar:5.1.3.RELEASE]at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:800) ~[spring-webmvc-5.1.3.RELEASE.jar:5.1.3.RELEASE]at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) ~[spring-webmvc-5.1.3.RELEASE.jar:5.1.3.RELEASE]at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1038) ~[spring-webmvc-5.1.3.RELEASE.jar:5.1.3.RELEASE]at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:942) ~[spring-webmvc-5.1.3.RELEASE.jar:5.1.3.RELEASE]at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1005) ~[spring-webmvc-5.1.3.RELEASE.jar:5.1.3.RELEASE]at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:897) ~[spring-webmvc-5.1.3.RELEASE.jar:5.1.3.RELEASE]at javax.servlet.http.HttpServlet.service(HttpServlet.java:634) ~[tomcat-embed-core-9.0.13.jar:9.0.13]at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:882) ~[spring-webmvc-5.1.3.RELEASE.jar:5.1.3.RELEASE]at javax.servlet.http.HttpServlet.service(HttpServlet.java:741) ~[tomcat-embed-core-9.0.13.jar:9.0.13]at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) ~[tomcat-embed-core-9.0.13.jar:9.0.13]at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.13.jar:9.0.13]at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) ~[tomcat-embed-websocket-9.0.13.jar:9.0.13]at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.13.jar:9.0.13]at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.13.jar:9.0.13]at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:99) ~[spring-web-5.1.3.RELEASE.jar:5.1.3.RELEASE]at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) ~[spring-web-5.1.3.RELEASE.jar:5.1.3.RELEASE]at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.13.jar:9.0.13]at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.13.jar:9.0.13]at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:92) ~[spring-web-5.1.3.RELEASE.jar:5.1.3.RELEASE]at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) ~[spring-web-5.1.3.RELEASE.jar:5.1.3.RELEASE]at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.13.jar:9.0.13]at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.13.jar:9.0.13]at org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:93) ~[spring-web-5.1.3.RELEASE.jar:5.1.3.RELEASE]at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) ~[spring-web-5.1.3.RELEASE.jar:5.1.3.RELEASE]at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.13.jar:9.0.13]at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.13.jar:9.0.13]at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:200) ~[spring-web-5.1.3.RELEASE.jar:5.1.3.RELEASE]at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) ~[spring-web-5.1.3.RELEASE.jar:5.1.3.RELEASE]at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.13.jar:9.0.13]at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.13.jar:9.0.13]at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:199) ~[tomcat-embed-core-9.0.13.jar:9.0.13]at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96) [tomcat-embed-core-9.0.13.jar:9.0.13]at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:490) [tomcat-embed-core-9.0.13.jar:9.0.13]at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139) [tomcat-embed-core-9.0.13.jar:9.0.13]at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) [tomcat-embed-core-9.0.13.jar:9.0.13]at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) [tomcat-embed-core-9.0.13.jar:9.0.13]at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343) [tomcat-embed-core-9.0.13.jar:9.0.13]at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:408) [tomcat-embed-core-9.0.13.jar:9.0.13]at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66) [tomcat-embed-core-9.0.13.jar:9.0.13]at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:791) [tomcat-embed-core-9.0.13.jar:9.0.13]at org.apache..NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1417) [tomcat-embed-core-9.0.13.jar:9.0.13]at org.apache..SocketProcessorBase.run(SocketProcessorBase.java:49) [tomcat-embed-core-9.0.13.jar:9.0.13]at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [na:1.8.0_191]at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [na:1.8.0_191]at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) [tomcat-embed-core-9.0.13.jar:9.0.13]at java.lang.Thread.run(Thread.java:748) [na:1.8.0_191]

自定义异常类

也可以根据自己的想法去自定义一些异常类,或者结合使用

BaseException

package com.zyc.exception;import mon.HttpCode;import mons.lang3.StringUtils;import org.springframework.ui.ModelMap;/*** 异常*/@SuppressWarnings("serial")public abstract class BaseException extends RuntimeException {public BaseException() {}public BaseException(Throwable ex) {super(ex);}public BaseException(String message) {super(message);}public BaseException(String message, Throwable ex) {super(message, ex);}public void handler(ModelMap modelMap) {modelMap.put("code", getCode().value());if (StringUtils.isNotBlank(getMessage())) {modelMap.put("msg", getMessage());} else {modelMap.put("msg", getCode().msg());}modelMap.put("timestamp", System.currentTimeMillis());}protected abstract HttpCode getCode();}

IllegalParameterException

/****/package com.zyc.exception;import mon.HttpCode;/*** 400请求参数出错*/@SuppressWarnings("serial")public class IllegalParameterException extends BaseException {public IllegalParameterException() {}public IllegalParameterException(Throwable ex) {super(ex);}public IllegalParameterException(String message) {super(message);}public IllegalParameterException(String message, Throwable ex) {super(message, ex);}protected HttpCode getCode() {return HttpCode.BAD_REQUEST;}}

测试Controller

package com.zyc.controller;import mon.Assert;import mons.lang3.StringUtils;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController;@RestControllerpublic class ExceptionDemoController {private static final String ID_NUM = null;@RequestMapping("/get")public String getName() {Assert.notNull(ID_NUM, "ID");return "id :" + ID_NUM + "author is zyc";}@RequestMapping("/param")public String getParam() {if (StringUtils.isEmpty(ID_NUM)) {throw new IllegalArgumentException("Id 为空!");}return "result success !";}}

结果

-12-15 22:33:03.913 ERROR 7353 --- [nio-8080-exec-4] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is java.lang.IllegalArgumentException: Id 为空!] with root causejava.lang.IllegalArgumentException: Id 为空!at com.zyc.controller.ExceptionDemoController.getParam(ExceptionDemoController.java:23) ~[classes/:na]at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_191]at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_191]at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_191]at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_191]at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:189) ~[spring-web-5.1.3.RELEASE.jar:5.1.3.RELEASE]at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:138) ~[spring-web-5.1.3.RELEASE.jar:5.1.3.RELEASE]at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:102) ~[spring-webmvc-5.1.3.RELEASE.jar:5.1.3.RELEASE]at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:895) ~[spring-webmvc-5.1.3.RELEASE.jar:5.1.3.RELEASE]at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:800) ~[spring-webmvc-5.1.3.RELEASE.jar:5.1.3.RELEASE]at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) ~[spring-webmvc-5.1.3.RELEASE.jar:5.1.3.RELEASE]at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1038) ~[spring-webmvc-5.1.3.RELEASE.jar:5.1.3.RELEASE]at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:942) ~[spring-webmvc-5.1.3.RELEASE.jar:5.1.3.RELEASE]at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1005) ~[spring-webmvc-5.1.3.RELEASE.jar:5.1.3.RELEASE]at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:897) ~[spring-webmvc-5.1.3.RELEASE.jar:5.1.3.RELEASE]at javax.servlet.http.HttpServlet.service(HttpServlet.java:634) ~[tomcat-embed-core-9.0.13.jar:9.0.13]at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:882) ~[spring-webmvc-5.1.3.RELEASE.jar:5.1.3.RELEASE]at javax.servlet.http.HttpServlet.service(HttpServlet.java:741) ~[tomcat-embed-core-9.0.13.jar:9.0.13]at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) ~[tomcat-embed-core-9.0.13.jar:9.0.13]at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.13.jar:9.0.13]at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) ~[tomcat-embed-websocket-9.0.13.jar:9.0.13]at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.13.jar:9.0.13]at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.13.jar:9.0.13]at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:99) ~[spring-web-5.1.3.RELEASE.jar:5.1.3.RELEASE]at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) ~[spring-web-5.1.3.RELEASE.jar:5.1.3.RELEASE]at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.13.jar:9.0.13]at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.13.jar:9.0.13]at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:92) ~[spring-web-5.1.3.RELEASE.jar:5.1.3.RELEASE]at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) ~[spring-web-5.1.3.RELEASE.jar:5.1.3.RELEASE]at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.13.jar:9.0.13]at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.13.jar:9.0.13]at org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:93) ~[spring-web-5.1.3.RELEASE.jar:5.1.3.RELEASE]at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) ~[spring-web-5.1.3.RELEASE.jar:5.1.3.RELEASE]at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.13.jar:9.0.13]at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.13.jar:9.0.13]at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:200) ~[spring-web-5.1.3.RELEASE.jar:5.1.3.RELEASE]at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) ~[spring-web-5.1.3.RELEASE.jar:5.1.3.RELEASE]at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.13.jar:9.0.13]at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.13.jar:9.0.13]at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:199) ~[tomcat-embed-core-9.0.13.jar:9.0.13]at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96) [tomcat-embed-core-9.0.13.jar:9.0.13]at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:490) [tomcat-embed-core-9.0.13.jar:9.0.13]at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139) [tomcat-embed-core-9.0.13.jar:9.0.13]at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) [tomcat-embed-core-9.0.13.jar:9.0.13]at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) [tomcat-embed-core-9.0.13.jar:9.0.13]at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343) [tomcat-embed-core-9.0.13.jar:9.0.13]at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:408) [tomcat-embed-core-9.0.13.jar:9.0.13]at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66) [tomcat-embed-core-9.0.13.jar:9.0.13]at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:791) [tomcat-embed-core-9.0.13.jar:9.0.13]at org.apache..NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1417) [tomcat-embed-core-9.0.13.jar:9.0.13]at org.apache..SocketProcessorBase.run(SocketProcessorBase.java:49) [tomcat-embed-core-9.0.13.jar:9.0.13]at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [na:1.8.0_191]at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [na:1.8.0_191]at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) [tomcat-embed-core-9.0.13.jar:9.0.13]at java.lang.Thread.run(Thread.java:748) [na:1.8.0_191]

然后也可以根据自己的业务逻辑需求去自定义一些其他的异常类,或者结合自己的逻辑去改造一些

好的到这里本篇文章就先到此了,创作不易,如果那里有不合适的地方还请大家多多指教,写这篇博的目的主要就是为了方便自己以后的一个回忆和朋友学习时的一个参考,希望为大家可以带来帮助 ~ ~&

虚心的去学习,自信的去工作~

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。