1、定义统一返回数据格式:
public class CommonResponse<T> {
private String status;
private String message;
private T data;
public CommonResponse() {
}
public CommonResponse(String status, String message) {
this.status = status;
this.message = message;
}
public String getStatus() {
return status;
}
public CommonResponse<T> setStatus(String status) {
this.status = status;
return this;
}
public String getMessage() {
return message;
}
public CommonResponse<T> setMessage(String message) {
this.message = message;
return this;
}
public T getData() {
return data;
}
public CommonResponse<T> setData(T data) {
this.data = data;
return this;
}
public static CommonResponse successResponse(Object data){
CommonResponse response = new CommonResponse<>();
response.setData(data);
return response;
}
2、统一异常处理:
这里我们使用@ControllerAdvice注解来实现,用于定义@ExceptionHandler、@InitBinder、@ModelAttribute,并应用到所有@RequestMapping中,即Controller的切面。
@ExceptionHandler 用于发生异常时进行处理。
@ControllerAdvice
public class CommonExceptionHanlder {
@ExceptionHandler(Exception.class) //对那些异常进行处理
@ResponseBody //定义返回类型,
public CommonResponse response(Exception e){
if(e instanceof UnauthenticatedException){
//这里可以添加日志
return new CommonResponse("501","用户未登录");
}
if(e instanceof UnauthorizedException){
return new CommonResponse("502","暂无访问权限");
}
else{
return new CommonResponse("500","系统错误");
}
}
}
这样就避免了直接返回错误信息给用户。
3、统一返回格式:
ResponseBodyAdvice是spring4.1的新特性,其作用是在响应体写出之前做一些处理;比如,修改返回值、加密等。
RequestBodyAdvice 则可以在Body进行解析前进行的一些处理,例如解密
这里我们使用的是ResponseBodyAdvice,在响应体写出之前对数据进行数据的封装。
@ControllerAdvice
//需要继承ResponseBodyAdvice,重写方法
public class ResponseAdvice implements ResponseBodyAdvice {
//这个方法用来判断是否要执行beforeBodyWrite方法。
@Override
public boolean supports(MethodParameter methodParameter, Class aClass) {
//在实际项目中可以添加注解来判断哪些需要进行数据的修改
return true;
}
@Override
public Object beforeBodyWrite(Object o, MethodParameter methodParameter, MediaType mediaType, Class aClass, ServerHttpRequest serverHttpRequest, ServerHttpResponse serverHttpResponse) {
//返回封装的数据
return CommonResponse.successResponse(o);
}