一个response的标准格式
status状态码
response描述,对本次状态码的描述
data数据,本次返回的数据
{"status":0,"desc":"成功","data":"test"}
初级程序员对response代码封装
对response的统一封装,是有一定的技术含量的
1把标准格式转化为代码
2把状态码存在枚举类里面
3加一个体验类
把返回的数据转化为自己编写的代码
结论,这样写代码有什么问题,看到这里,应该有很多同学都知道这样封装代码有很大弊端,因为你每写一个接口,都要手工指定Result.sut()这行代码,多累啊
如果你写这种代码推广给你整个公司用,然后强硬规定代码必须这么写,所有公司员工都会吐槽你鄙视你
更可怕的是,互联网很多教程都是这么写的
互联网上的很多java教程包括文章都是垃圾中的垃圾
这么写是要被人骂的,高级程序员是不需要Result.sut()这行代码的
不需要每个接口都手工指定Result返回值
采用ResponseBodyAdvice技术来实现response的统一格式
ResponseBodyAdvice类,拦截Controller方法的返回值,统一处理返回值/响应体,一般来做response的统一格式,加密,签名等
步骤2:写一个这个接口的实现类
@ControllerAdvice(basePackages="com.example")
增加Controller的扩展功能类
体现在两个方面,对Controller全局数据统一处理,例如这节课就是对response统一封装。对全局异常的统一处理
com.exampe
config
service
controller
如果不加根包的话,可能会对整个系统的Controller做出了扩展
统一返回数据接口
response包
package com.example.demo.response;
public enum ResultCode {
SUCCESS(0,"成功"),
SYSTEM_ERROR(10000,"系统异常,请稍后重试"),
UNTHORIZED(10401,"签名验证失败"),
PARAM_IS_INVALID(10001,"参数无效"),
USER_HAS_EXISTED(20001,"用户名已存在"),
USER_NOT_FOUND(20002,"用户名不存在");
private Integer code;
private String message;
ResultCode(Integer code,String message){
this.code = code;
this.message = message;
}
public Integer code(){
return code;
}
public String message(){
return message;
}
}
package com.example.demo.response;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@AllArgsConstructor
@NoArgsConstructor
@Data
public class Result {
private Integer status;
private String desc;
private T data;
public static Result suc(){
Result result = new Result();
result.setResultCode(ResultCode.SUCCESS);
return result;
}
public static Result suc(Object data){
Result result = new Result();
result.setResultCode(ResultCode.SUCCESS);
result.setData(data);
return result;
}
public static Result fail(Integer status,String desc){
Result result = new Result();
result.setStatus(status);
result.setDesc(desc);
return result;
}
public static Result fail(ResultCode resultCode){
Result result = new Result();
result.setResultCode(resultCode);
return result;
}
private void setResultCode(ResultCode resultCode){
this.status = resultCode.code();
this.desc = resultCode.message();
}
}
在返回数据的时候
使用Result.suc("hello world")即可
advice包
@ControllerAdvice(basePackages = "com.example.demo")
public class ResponseHandler implements ResponseBodyAdvice
@Override
public boolean supports(MethodParameter methodParameter, Class extends HttpMessageConverter>> aClass) {
return true;
}
@Override
public Object beforeBodyWrite(Object o, MethodParameter methodParameter, MediaType mediaType, Class extends HttpMessageConverter>> aClass, ServerHttpRequest serverHttpRequest, ServerHttpResponse serverHttpResponse) {
}
}
这样返回数据的时候,就会做统一处理
@AllArgsConstructor和@NoArgsConstructor和@Data注解一定要加,枚举里如果有两个变量,那么就可以
RED(100,"红色"),BLUE(101,"蓝色");
也要有构造函数,给成员变量赋参数值