使用AOP定义一个统一的返回结构,使得项目规范化,能够自定义异常说明
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@Data
@ApiModel("返回说明")
public class Result<T> {
@ApiModelProperty("返回码")
private int code;
@ApiModelProperty("描述")
private String msg;
@ApiModelProperty("数据")
private T data;
/**
* 默认构造,返回操作正确的返回代码和信息
*/
public Result() {
this.setCode(ResultCode.SUCCESS.val());
this.setMsg(ResultCode.SUCCESS.msg());
}
/**
* 构造一个返回特定代码的ReturnVO对象
* @param code
*/
public Result(ResultCode code) {
this.setCode(ResultCode.SUCCESS.val());
this.setMsg(ResultCode.SUCCESS.msg());
}
/**
* 默认值返回,默认返回正确的code和message
* @param data
*/
public Result(T data) {
this.setCode(ResultCode.SUCCESS.val());
this.setMsg(ResultCode.SUCCESS.msg());
this.setData(data);
}
/**
* 构造返回代码,以及自定义的错误信息
* @param code
* @param message
*/
public Result(ResultCode code, String message) {
this.setCode(code.val());
this.setMsg(message);
}
/**
* 构造自定义的code,message,以及data
* @param code
* @param message
* @param data
*/
public Result(ResultCode code, String message, T data) {
this.setCode(code.val());
this.setMsg(message);
this.setData(data);
}
@Override
public String toString() {
return "ReturnVO{" +
"code='" + code + '\'' +
", message='" + msg + '\'' +
", data=" + data +
'}';
}
}
public enum ResultCode {
/** 操作成功 */
SUCCESS(200, "成功"),
/** 操作失败 */
FAIL(500, "操作失败"),
/** 空指针异常 */
NullpointerException(500, "空指针异常"),
/** token失效 */
TokenExpire(500,"token失效 ");
ResultCode(int value, String msg){
this.val = value;
this.msg = msg;
}
public int val() {
return val;
}
public String msg() {
return msg;
}
private int val;
private String msg;
}
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;
@Aspect
@Component
public class ResponseAop {
//这里改成自己项目的控制层路径
@Pointcut("execution(public * com.husscess.qxwgh.controller..*(..))")
public void httpResponse() {
}
//环切
@Around("httpResponse()")
public Result handlerController(ProceedingJoinPoint proceedingJoinPoint) {
Result result = new Result();
try {
//获取方法的执行结果
Object proceed = proceedingJoinPoint.proceed();
//如果方法的执行结果是Result,则将该对象直接返回
if (proceed instanceof Result) {
result = (Result) proceed;
} else {
//否则,就要封装到Result的data中
result.setData(proceed);
}
} catch (Throwable throwable) {
//如果出现了异常,调用异常处理方法将错误信息封装到Result中并返回
result = handlerException(throwable);
}
return result;
}
//异常处理
private Result handlerException(Throwable throwable) {
Result result = new Result();
//这里需要注意,返回枚举类中的枚举在写的时候应该和异常的名称相对应,以便动态的获取异常代码和异常信息,我这边是统一返回500,msg存报的异常
//获取异常名称的方法
String errorName = throwable.toString();
errorName = errorName.substring(errorName.lastIndexOf(".") + 1);
result.setMsg(errorName);
result.setCode(500);
return result;
}
}
@ResponseBody
@RequestMapping("/login")
@ApiOperation(value = "登录",httpMethod = "GET")
@ApiImplicitParams({
@ApiImplicitParam(name ="username",value = "账号",required = true,dataType = "String",paramType = "query"),
@ApiImplicitParam(name ="password",value = "密码",required = true,dataType = "String",paramType = "query")}
)
public Object login(String username, String password){
List<User>list=userService.verifyUser(username,password);
if(list.size()==0){
throw new APIException("账号或密码错误");
}
User user=list.get(0);
String tokenWithUserInfos= JWTUtil.createTokenWithUserInfos(user.getId(),user.getName(),user.getUnit(),
user.getLevel(),24 * 60 * 60L);
user.setToken(tokenWithUserInfos);
if(tokenWithUserInfos != null){
String sub_jwt = tokenWithUserInfos.substring(tokenWithUserInfos.lastIndexOf(".") + 1);
redisUtils.set(sub_jwt, tokenWithUserInfos, 3 * 60 * 60);
}
return user;
}
接口返回得用object才行,但是使用object swagger就没法看到返回值说明了,等以后找到方法了再更新
详细说明博客