栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

springboot全局统一返回值

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

springboot全局统一返回值

基于注解纯干货实现,废话不多。可按需修改对所有方法进行封装。
对你有帮助的话,点个赞噢

编码实现

返回值对象

package com.esp.common.vo;

import com.esp.common.enums.ResponseEnum;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.ToString;

import java.io.Serializable;
import java.time.LocalDateTime;


@Getter
@ToString
@AllArgsConstructor
public class ResponseVo implements Serializable {

    private static final long serialVersionUID = 728686158789041007L;

    private Integer code;
    private String message;
    private LocalDateTime timestamp;
    private T data;

    private ResponseVo(){}

    public ResponseVo(ResponseEnum responseEnum) {
        this.code = responseEnum.getCode();
        this.message = responseEnum.getMessage();
        this.timestamp = LocalDateTime.now();
    }

    public ResponseVo(Integer code, String message) {
        this.code = code;
        this.message = message;
        this.timestamp = LocalDateTime.now();
    }

    public ResponseVo(Integer code, String message, T data) {
        this.code = code;
        this.message = message;
        this.data = data;
        this.timestamp = LocalDateTime.now();
    }

    public ResponseVo(ResponseEnum responseEnum, T data) {
        this.code = responseEnum.getCode();
        this.message = responseEnum.getMessage();
        this.data = data;
        this.timestamp = LocalDateTime.now();
    }

}

封装返回值对象工具类

package com.esp.common.util.response;

import com.esp.common.enums.ResponseEnum;
import com.esp.common.vo.ResponseVo;


public class ResponseUtils {

    public static  ResponseVo success() {
        return new ResponseVo(ResponseEnum.SUCCESS);
    }

    public static  ResponseVo getResponseVo(ResponseEnum responseEnum) {
        return new ResponseVo(responseEnum);
    }

    public static  ResponseVo getResponseVo(Integer code, String message) {
        return new ResponseVo(code, message);
    }

    public static  ResponseVo getResponseVo(Integer code, String message, T data) {
        return new ResponseVo(code, message, data);
    }

    public static  ResponseVo getResponseVo(ResponseEnum responseEnum, T data) {
        return new ResponseVo(responseEnum, data);
    }

}

定义返回值状态码

package com.esp.common.enums;

import lombok.AllArgsConstructor;
import lombok.Getter;


@Getter
@AllArgsConstructor
public enum ResponseEnum {

    
    SUCCESS(0, "成功"),
    
    UNKONW_ERROR(-1, "未知错误"),
    REQUEST_TOO_MANY(-2, "请勿重复请求"),

    
    PARAM_IS_BANK(1001, "参数存在空值"),
    PARAM_IS_INVALID(1002, "参数无效"),

    
    UCOMPANY_NOT_EXIST(2001, "企业不存在"),

    
    UOPERATE_NOT_EXIST(3001, "用户不存在"),
    ;


    private Integer code;
    private String message;

}

自定义注解

package com.esp.common.annotation;

import java.lang.annotation.*;


@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE, ElementType.METHOD})
public @interface ResponseData {}

自定义异常

package com.esp.common.exception;

import com.esp.common.enums.ResponseEnum;
import lombok.Getter;


@Getter
public class ErrorResultException extends RuntimeException{

    private Integer code;
    private String message;

    public ErrorResultException(ResponseEnum responseEnum) {
        super(responseEnum.getMessage());
        this.code = responseEnum.getCode();
        this.message = responseEnum.getMessage();
    }

    public ErrorResultException(Integer code, String message) {
        super(message);
        this.code = code;
        this.message = message;
    }

}

基于@RestController按需封装返回值

package com.esp.common.advice;

import com.esp.common.annotation.ResponseData;
import com.esp.common.enums.ResponseEnum;
import com.esp.common.exception.ErrorResultException;
import com.esp.common.util.response.ResponseUtils;
import com.esp.common.vo.ResponseVo;
import org.springframework.core.MethodParameter;
import org.springframework.core.annotation.AnnotatedElementUtils;
import org.springframework.http.MediaType;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.server.ServerHttpRequest;
import org.springframework.http.server.ServerHttpResponse;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice;

import java.lang.annotation.Annotation;


@RestControllerAdvice
public class ResponseAdvice implements ResponseBodyAdvice {

    public static final Class ANNOTATION_TYPE = ResponseData.class;

    @Override
    public boolean supports(MethodParameter returnType, Class> converterType) {
        return AnnotatedElementUtils.hasAnnotation(returnType.getContainingClass(), ANNOTATION_TYPE)
                || returnType.hasMethodAnnotation(ANNOTATION_TYPE);
    }

    @Override
    public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType,
                                  Class> selectedConverterType,
                                  ServerHttpRequest request, ServerHttpResponse response) {
        if (body instanceof ResponseVo) return body;
        // 判断是否有异常
        if (body instanceof ErrorResultException) {
            ErrorResultException errorResultException = (ErrorResultException) body;
            return ResponseUtils.getResponseVo(errorResultException.getCode(), errorResultException.getMessage());
        }
        return ResponseUtils.getResponseVo(ResponseEnum.SUCCESS, body);
    }

}

 

配置转换器

package com.esp.common.config;

import org.springframework.context.annotation.Configuration;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.StringHttpMessageConverter;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

import java.util.List;


@Configuration
public class WebConfiguration implements WebMvcConfigurer {

    @Override
    public void configureMessageConverters(List> converters) {
        // 将 json 处理的转换器放到第一位,使得先让 json 转换器处理返回值
//        converters.add(0, new MappingJackson2HttpMessageConverter());
        // 把String类型的转换器去掉,不使用String类型的转换器
        converters.removeIf(httpMessageConverter -> httpMessageConverter.getClass() == StringHttpMessageConverter.class);
    }

}

测试
@RestController
public class TestController {

    @ResponseData
    @GetMapping("test")
    public String test() {
        return "test";
    }
    
}

转载请注明:文章转载自 www.mshxw.com
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号