!!!作者项目包的结构图!!!
Common的包下
Constants.interface(统一的常量定义地方,例如状态码)
package com.example.common;
/**
* 统一常量定义
* **/
public interface Constants {
String CODE_200 = "200";//成功
String CODE_401 = "401"; // 权限不足
String CODE_400 = "400"; // 参数错误
String CODE_500 = "500"; // 系统错误
String CODE_600 = "600"; // 其他业务异常
}
Result.java(统一返回前端封装类)
package com.example.common;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* 统一返回前端封装类
* **/
@Data
@AllArgsConstructor//全参数的构造器参数
@NoArgsConstructor//没有参数的构造器的参数注解
public class Result {
private String code;
private String msg;
private Object data;
public static Result success() {
return new Result(Constants.CODE_200, "", null);
}
public static Result success(Object data) {
return new Result(Constants.CODE_200, "", data);
}
public static Result error(String code, String msg) {
return new Result(code, msg, null);
}
public static Result error() {
return new Result(Constants.CODE_500, "系统错误", null);
}
}
Exception包
ServiceException.java(自定义的异常)
package com.example.Exception;
import lombok.Getter;
/**
* @author: Carden
* @Date
* @Description:自定义异常
* **/
@Getter
public class ServiceException extends RuntimeException {
private String code;
//不要定义msg,因为RuntimeException有msg存在
public ServiceException(String code, String msg) {
super(msg);
this.code = code;
}
}
GlobalExceptionHandler.java(自定义的异常捕获的处理)
package com.example.Exception;
import com.example.common.Result;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
/**
* @author: Carden
* @Date
* @Description:自定义异常处理
* **/
/**
* 初定义拦截规则:
ControllerAdvice 提供了多种指定Advice规则的定义方式,默认什么都不写,则是Advice所有Controller,当然你也可以通过下列的方式指定规则
比如对于 String[] value() default {} ,
写成@ControllerAdvice("org.my.pkg") 或者 @ControllerAdvice(basePackages="org.my.pkg"),
则匹配org.my.pkg包及其子包下的所有Controller,当然也可以用数组的形式指定,
如:@ControllerAdvice(basePackages={"org.my.pkg", "org.my.other.pkg"}),
也可以通过指定注解来匹配,比如我自定了一个 @CustomAnnotation 注解,我想匹配所有被这个注解修饰的 Controller,
可以这么写:@ControllerAdvice(annotations={CustomAnnotation.class})
@ControllerAdvice 配合 @ExceptionHandler 实现全局异常处理
@ControllerAdvice 配合 @ModelAttribute 预设全局数据
@ControllerAdvice 配合 @InitBinder 实现对请求参数的预处理
* */
@ControllerAdvice
public class GlobalExceptionHandler extends RuntimeException{
/**
* 如果抛出的的是ServiceException,则调用该方法
* @param se 业务异常
* @return Result
*/
@ExceptionHandler(ServiceException.class)//捕获自定义异常时的处理
@ResponseBody
public Result handle(ServiceException se){
return Result.error(se.getCode(), se.getMessage());
}
}