Springboot 中设置统一的返回格式

在我们应用中我们通常与前端交互使用json 格式,设置统一的返回json 格式是非常必要的,可以减少开发人员的工作量。

第一个使用统一的消息转换器,这里使用jackson 的相关功能,引入jar

复制代码
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
</dependency>
  1. 创建一个全局配置类(GlobalConfig)并使用@Configuration注解标记该类为配置类。然后,在该类上使用@EnableWebMvc注解开启对MVC的支持。

  2. 在该配置类中重写configureMessageConverters()方法,将Jackson消息转换器添加到默认的消息转换器列表中。示例如下所示:

    java 复制代码
    @Configuration
    @EnableWebMvc
    public class GlobalConfig extends WebMvcConfigurerAdapter {
        
        @Override
        public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
            ObjectMapper objectMapper = new ObjectMapper();
            
            // 设置日期序列化/反序列化格式
            JavaTimeModule javaTimeModule = new JavaTimeModule();
            javaTimeModule.addSerializer(LocalDateTime.class, LocalDateTimeSerializer.INSTANCE);
            javaTimeModule.addDeserializer(LocalDateTime.class, LocalDateTimeDeserializer.INSTANCE);
            objectMapper.registerModule(javaTimeModule);
            
            // 其他自定义配置...
            
            Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder()
                    .serializationInclusion(JsonInclude.Include.NON_NULL)
                    .featuresToDisable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
                    
            MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter(builder.build());
            converters.add(converter);
        }
    }

    二、声明统一格式的返回类型,一般包含code、message、data 三部分

1)定义一个返回结果 IResultStatus

java 复制代码
public interface IResultStatus {

    /**
     * 业务状态码
     * @return Integer
     */
     Integer code();

    /**
     * 业务信息描述
     * @return String
     */
     String message();
}

2)创建一个枚举实体

java 复制代码
public enum ResultStatus implements IResultStatus {

    /**
     * 成功
     */
    SUCCESS(200, "OK"),
    /**
     * 错误的请求,参数异常
     */
    BAD_REQUEST(400, "Bad Request params exception"),
    /**
     * 服务器异常
     */
    INTERNAL_SERVER_ERROR(500, "Internal Server Error"),

    /**
     * 401 未认证异常
     */
    UNAUTHORIZED(401, "认证异常"),


    /**
     * 业务异常
     */
    BUSINESS_ERR(10000, "业务异常");


    /**
     * 业务状态码
     */
    private Integer code;

    /**
     * 业务信息描述
     */
    private String message;

     ResultStatus (Integer code, String message) {
         this.code = code;
         this.message = message;
     }

    /**
     * 业务状态码
     *
     * @return Integer
     */
    @Override
    public Integer code() {
        return code;
    }

    /**
     * 业务信息描述
     *
     * @return String
     */
    @Override
    public String message() {
        return message;
    }
}

3)引入lamada 定义返回实体

java 复制代码
@Data
public class Result<T> {
    /**
     * 业务错误码
     */
    private Integer code;
    /**
     * 信息描述
     */
    private String message;
    /**
     * 返回参数
     */
    private T data;

    private Result(IResultStatus resultStatus, T data) {
        this.code = resultStatus.code();
        this.message = resultStatus.message();
        this.data = data;
    }

    private Result(Integer code, String message, T data) {
        this.code = code;
        this.message = message;
        this.data = data;
    }


    /**
     * 业务成功返回业务代码和描述信息
     */
    public static Result<Void> success() {
        return new Result<Void>(ResultStatus.SUCCESS, null);
    }

    /**
     * 业务成功返回业务代码,描述和返回的参数
     */
    public static <T> Result<T> success(T data) {
        return new Result<T>(ResultStatus.SUCCESS, data);
    }

    /**
     * 业务成功返回业务代码,描述和返回的参数
     */
    public static <T> Result<T> success(IResultStatus resultStatus, T data) {
        if (resultStatus == null) {
            return success(data);
        }
        return new Result<T>(resultStatus, data);
    }

    /**
     * 业务成功返回业务代码,描述和返回的参数
     */
    public static <T> Result<T> success(Integer code, String message, T data) {
        return new Result<T>(code, message, data);
    }


    /**
     * 业务异常返回业务代码和描述信息
     */
    public static <T> Result<T> fail() {
        return new Result<T>(ResultStatus.BUSINESS_ERR, null);
    }

    /**
     * 业务异常返回业务代码和描述信息
     */
    public static <T> Result<T> fail(String message) {
        return new Result<T>(ResultStatus.BUSINESS_ERR.code(), message, null);
    }

    /**
     * 业务异常返回业务代码,描述和返回的参数
     */
    public static <T> Result<T> fail(IResultStatus resultStatus) {
        return fail(resultStatus, null);
    }

    /**
     * 业务异常返回业务代码,描述和返回的参数
     */
    public static <T> Result<T> fail(IResultStatus resultStatus, String message) {
        if (resultStatus == null) {
            return new Result<T>(ResultStatus.BUSINESS_ERR, null);
        }
        return new Result<T>(resultStatus.code(), message, null);
    }
}

上述实体我们都定义好了,可以结合我们的上述jackson 包进行配置json 配置

java 复制代码
@Configuration
public class JsonSerializeConfig {

	@Bean
	@Primary
	@ConditionalOnMissingBean(ObjectMapper.class)
	public ObjectMapper jacksonObjectMapper(Jackson2ObjectMapperBuilder builder) {
		ObjectMapper objectMapper = builder.createXmlMapper(false).build();
        .....这里省去自定义格式类型
    }
}

那么在使用时通过创建我们的返回实体进行接口返回。

java 复制代码
public Result<>  call((){

   .......省去业务
  return new Result();//根据构造函数返回
}
相关推荐
IT_陈寒2 小时前
React的这个渲染问题连官方文档都没说清楚
前端·人工智能·后端
狼爷2 小时前
吃透 Java Function 接口,搞定 99% 的 Stream 场景
java·函数式编程
葫芦和十三2 小时前
图解 MongoDB 15|journal 与持久化:写入怎么不丢,崩溃怎么恢复
后端·mongodb·面试
葫芦和十三2 小时前
图解 MongoDB 16|压缩:snappy、zstd 和 zlib 的取舍
后端·mongodb·面试
苍何3 小时前
终于找到免费开源TTS模型,克隆声音不要钱,本地电脑也能跑
后端
用户593608741403 小时前
Spring AI 集成 DeepSeek 原生供应商并实现think模式
后端
追逐时光者3 小时前
别再满网找零散工具了,腾讯 QQ 浏览器这个“帮小忙”工具箱真能省时间
前端·后端
心静自然凉8003 小时前
Linux网络核心知识+bonding主备模式配置
后端
爻渡5 小时前
异步编程演进史:从回调到Promise再到Async/Await
后端·程序员
要阿尔卑斯吗6 小时前
企业级 RAG 系统的文件标签管理:三层架构与层级优化实战
后端