在前后端分离的开发中,开发后端返回的数据往往是在controller层中返回的,一般都是在controller写Restful风格的接口来返回数据。这时候返回的数据格式一般都是json格式,而且返回一般都有一个统一的数据结构形式 即:
{
“code”:…(请求接口返回的码)
“msg”:…(请求接口返回的信息)
“data”:…(一般返回数据,若是不返回就不显示)
}
所以在springboot中需要创建一个自定义的统一返回处理类,来处理全局的输出
先自定义一个统一的返回结果类
1.RetResult.java
@JsonSerialize(include= JsonSerialize.Inclusion.NON_NULL)
public class RetResult<T> {
private int code;
private String msg;
private T data;
public RetResult(int code,String msg,T data){
this.code=code;
this.msg=msg;
this.data=data;
}
public int getCode() {
return code;
}
public void setCode(int code) {
this.code = code;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public T getData() {
return data;
}
public void setData(T data) {
this.data = data;
}
}
创建一个常用的code 枚举类型
2.RetCode
public enum RetCode {
// 成功
SUCCESS(200),
// 失败
FAIL(202),
// 未认证(签名错误)
UNAUTHORIZED(401),
// 接口不存在
NOT_FOUND(404),
// 服务器内部错误
INTERNAL_SERVER_ERROR(500);
public int code;
RetCode(int code) {
this.code = code;
}
}
自定义一些code,msg,data返回
3.RetResponse.java
public class RetResponse {
//自定义message 失败信息
public static <T> RetResult<T> makeErrRsp(String message) {
return new RetResult<T>(202,message,null);
}
//自定义code,msg 返回数据
public static <T> RetResult<T> makeRsp(int code, String msg) {
return new RetResult<T>(code,msg,null);
}
//自定义code,msg,data 返回数据
public static <T> RetResult<T> makeRsp(int code, String msg, T data) {
return new RetResult<T>(code,msg,data);
}
}
最后创建一个对全局返回输出的结果类的处理类
4.RetResultAdvice.java
@RestControllerAdvice
public class RetResultAdvice implements ResponseBodyAdvice<Object> {
//需要忽略拦截的类
//这个方法表示对于哪些请求要执行beforeBodyWrite,返回true执行,返回false不执行
@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) {
//如果是返回了RetResult类就直接返回不做处理
if (o instanceof RetResult) {
return o;
}
//如果返回的数据是string类型的时候做的处理
if(o instanceof String) {
return JSON.toJSONString(o);
}
return new RetResult(200,"success" , o);
}
}
controller层创建TestController.java测试
这里返回自己定义的用户测试数据
@RequestMapping(value = "/select/{openid}",method = RequestMethod.GET)
@ResponseBody
public User searchUser(@PathVariable String openid)
{
User user=userService.selectByOpenid(openid);
return user;
}
结果:
模拟测试没有返回数据,只执行一些业务
@RequestMapping("/test")
@ResponseBody
public void test(){
Random random=new Random();
int i=random.nextInt(10);
return;
}
测试返回自定义的code,msg:
@RequestMapping("/test")
@ResponseBody
public RetResult test(){
Random random=new Random();
int i=random.nextInt(10);
return RetResponse.makeRsp(208,"自定义msg");
}
结果: