Spring Boot 全局统一异常处理
访问不存在资源

访问error

首先封装一个返回类
一般我们需要包含 code(响应码)、msg(响应信息)、data(数据)等字段。
package com.example.bms.common.utils;
import java.util.HashMap;
import java.util.Map;
/**
* @author pangxie
* @data 2020/11/1 17:35
*
* 统一异常处理
*/
public class R extends HashMap<String,Object> {
private static final long serialVersionUID = 1L;
public R() {
put("code", 0);
put("msg", "操作成功");
}
public static R error() {
return error(1, "操作失败");
}
public static R error(String msg) {
return error(500, msg);
}
public static R error(int code, String msg) {
R r = new R();
r.put("code", code);
r.put("msg", msg);
return r;
}
public static R ok(String msg) {
R r = new R();
r.put("msg", msg);
return r;
}
public static R ok(Map<String, Object> map) {
R r = new R();
r.putAll(map);
return r;
}
public static R ok() {
return new R();
}
@Override
public R put(String key, Object value) {
super.put(key, value);
return this;
}
}
根据不同的错误类型,返回给用户不同的返回信息。Spring Boot 就提供了一个这样统一处理异常的接口类 ErrorController,并通过重写 getErrorPath() 方法实现异常页面跳转。
实现一个自定义的异常处理机制
package com.example.bms.common.utils;
import org.springframework.boot.web.servlet.error.ErrorController;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* @author pangxie
* @data 2020/11/1 17:38
*
* 统一异常处理
*/
@RestController
public class MainsiteErrorController implements ErrorController {
private final String ERROR_PATH = "/error";
/**
* 出现错误跳转到如下映射中
* @return
*/
@Override
public String getErrorPath() {
return ERROR_PATH;
}
/**
* Web 页面处理
* @param request
* @param response
* @return
*/
@RequestMapping(value = ERROR_PATH, produces = {"text/html"})
public ModelAndView errorHtml(HttpServletRequest request, HttpServletResponse response){
int code = response.getStatus();
if (404 == code){
return new ModelAndView("error/404");
}else if (403 == code){
return new ModelAndView("error/403");
}else if (401 == code){
return new ModelAndView("login");
}else {
return new ModelAndView("error/500");
}
}
@RequestMapping(value = ERROR_PATH)
public R handleError(HttpServletRequest request,HttpServletResponse response){
int code = response.getStatus();
if (404 == code){
return R.error(404,"未找到资源");
}else if (403 == code){
return R.error(403,"没有访问权限");
}else if (401 == code){
return R.error(401,"登录过期");
}else {
return R.error(500,"服务器错误");
}
}
}
Spring Boot 全局统一处理日期
日期时间类型是在开发中常遇到的数据类型
国内的常用日期格式为 yyyy-MM-dd HH:mm:ss,每次我们都需要对日期时间进行转换;另一个是时区问题,国内使用的是北京时间,也就是东八区时间。
针对日期类型解决如下两个问题。
1、当返回值时,Date 转换为 String。
2、当传入参数时,String 转换为 Date。
当返回值时,Date 转换为 String
直接访问时日期的显示是这样的

显示的时区是格林威治时间,与北京时间相差 8 个小时
解决这个问题我们需要在配置文件中 添加相关的配置
添加配置
spring:
jackson:
date-format: yyyy-MM-dd HH:mm:ss
time-zone: GMT+8
再次访问,效果达到

当传入参数时,String 转换为 Date
在 Date 类型中添加这样一行注解,但是每个都要添加的话就很容易忘
DateConverterConfig.java 类来统一处理
以后提交的表单信息中包含日期格式时,系统会自动将字符串类型转化为 java 日期类型
package com.example.bms.common.config;
import org.springframework.core.convert.converter.Converter;
import org.springframework.stereotype.Component;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
/**
* @author pangxie
* @data 2020/11/2 16:38
*
* 日期统一处理
*/
@Component
public class DateConverterConfig implements Converter<String, Date> {
private static final List<String> formarts = new ArrayList<>(4);
static {
formarts.add("yyyy-MM");
formarts.add("yyyy-MM-dd");
formarts.add("yyyy-MM-dd hh:mm");
formarts.add("yyyy-MM-dd hh:mm:ss");
}
@Override
public Date convert(String source) {
String value = source.trim();
if ("".equals(value)) {
return null;
}
if (source.matches("^\\d{4}-\\d{1,2}$")) {
return parseDate(source, formarts.get(0));
} else if (source.matches("^\\d{4}-\\d{1,2}-\\d{1,2}$")) {
return parseDate(source, formarts.get(1));
} else if (source.matches("^\\d{4}-\\d{1,2}-\\d{1,2} {1}\\d{1,2}:\\d{1,2}$")) {
return parseDate(source, formarts.get(2));
} else if (source.matches("^\\d{4}-\\d{1,2}-\\d{1,2} {1}\\d{1,2}:\\d{1,2}:\\d{1,2}$")) {
return parseDate(source, formarts.get(3));
} else {
throw new IllegalArgumentException("Invalid boolean value '" + source + "'");
}
}
/**
* 格式化日期
*
* @param dateStr String 字符型日期
* @param format String 格式
* @return Date 日期
*/
public Date parseDate(String dateStr, String format) {
Date date = null;
try {
DateFormat dateFormat = new SimpleDateFormat(format);
date = dateFormat.parse(dateStr);
} catch (Exception e) {
throw new IllegalArgumentException("Invalid boolean value ");
}
return date;
}
}
本文围绕 Spring Boot 展开,介绍了全局统一异常处理和日期处理方法。在异常处理方面,封装返回类,包含 code、msg、data 等字段,还可通过重写 ErrorController 接口方法实现异常页面跳转。日期处理则解决了返回值 Date 转 String 和传入参数 String 转 Date 的问题。
1526

被折叠的 条评论
为什么被折叠?



