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();//根据构造函数返回
}
相关推荐
2401_8576100314 分钟前
Spring Boot框架:电商系统的技术优势
java·spring boot·后端
希忘auto31 分钟前
详解MySQL安装
java·mysql
冰淇淋烤布蕾42 分钟前
EasyExcel使用
java·开发语言·excel
拾荒的小海螺1 小时前
JAVA:探索 EasyExcel 的技术指南
java·开发语言
Jakarta EE1 小时前
正确使用primefaces的process和update
java·primefaces·jakarta ee
马剑威(威哥爱编程)1 小时前
哇喔!20种单例模式的实现与变异总结
java·开发语言·单例模式
java—大象2 小时前
基于java+springboot+layui的流浪动物交流信息平台设计实现
java·开发语言·spring boot·layui·课程设计
ApiHug2 小时前
ApiSmart x Qwen2.5-Coder 开源旗舰编程模型媲美 GPT-4o, ApiSmart 实测!
人工智能·spring boot·spring·ai编程·apihug
魔道不误砍柴功2 小时前
探秘Spring Boot中的@Conditional注解
数据库·spring boot·oracle
杨哥带你写代码2 小时前
网上商城系统:Spring Boot框架的实现
java·spring boot·后端