【框架篇】统一数据格式返回

✅作者简介:大家好,我是小杨
个人主页:「小杨」的csdn博客

希望大家多多支持一起进步呀!


1,统一数据格式返回的介绍

统一数据返回是指在进行接口开发时对返回数据进行规范和统一处理,确保返回数据的格式和结构保持一致。

可以通过使用@ControllerAdvice注解结合ResponseBodyAdvice接口实现统一的数据返回格式。

  • @ControllerAdvice注解用于定义一个全局通知的类,可以用于定义一些全局处理逻辑,例如异常处理、数据绑定、数据格式化等。该注解声明的类可以包含异常处理方法、绑定前和绑定后的拦截方法,以及其他的通用处理逻辑。
  • ResponseBodyAdvice接口是Spring框架提供的一个拦截响应体的接口,它可以在响应体返回给客户端之前对响应数据进行处理。通过实现该接口,在拦截器中可以对数据进行统一的封装、格式化或加工,以实现统一的数据返回格式。

2,统一数据格式返回的实现流程

1,创建一个统一数据返回处理类

@ControllerAdvice
public class ResponseAdvice implements ResponseBodyAdvice {
}

2,ResponseBodyAdvice 中两个方法重写

2.1,supports方法重写

image-20230906153758709

注意:该方法表示是否执行后续的beforeBodyWrite方法,该方法默认返回false,表示不进行后续的代码操作,也就是数据的加工处理,而返回true,才会执行后续的beforeBodyWrite方法。

2.2,beforeBodyWrite方法重写

【框架篇】统一数据格式返回_第1张图片

注意:该方法实现返回数据格式的重写,让其返回统一的数据格式。


3,统一数据格式返回的实现代码

@ControllerAdvice
public class ResponseAdvice implements ResponseBodyAdvice {
    @Override
    public boolean supports(MethodParameter returnType, Class converterType) {
        // 在这里可以根据条件判断是否需要对响应体进行处理
        // 这里直接返回 true 表示对所有请求的响应体进行处理
        return true;
    }

    @Override
    public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType, Class selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) {
        // 在这里对响应体进行处理,可以进行封装、格式化等操作
        HashMap<String,Object> result = new HashMap<>();
        result.put("code",200);
        result.put("msg","");
        result.put("data",body);
        // 返回处理后的数据
        return result;
    }
}

4,统一数据格式返回的实现注意

在统一数据处理时,如果你的统一数据处理方法返回类型是String,返回时会出现报错的情况。

返回时具体的执行流程为:

  1. 方法返回的是String类型。
  2. 执行统一数据返回之前的处理:将String转换为HashMap
  3. HashMap转换为application/json字符串返回给前端。

根据源代码的结论,数据转换的过程中会判断原始数据的类型,并选择相应的消息转换器来进行数据的转换。

  • 如果原始数据的类型为String,则会使用StringHttpMessageConverter进行类型转换。
  • 如果原始数据不是String,则会使用其他合适的HttpMessageConverter进行类型转换。

由于统一数据处理方法返回的是String类型,在第三步中会选择StringHttpMessageConverter进行转换。然而,StringHttpMessageConverter无法直接将HashMap对象直接转换为字符串,因此造成了报错。

注:StringHttpMessageConverter默认情况下将只处理字符串类型的数据,故当使用StringHttpMessageConverter时,无法直接将HashMap对象直接转换为字符串,而HttpMessageConverter可以将HashMap转换为字符串。


为了解决这个问题,可以采取以下方法之一:

  1. 移除StringHttpMessageConverter:在Spring MVC的配置中,可以考虑移除StringHttpMessageConverter,这样就不会再将String类型的返回值视为需要进行JSON转换的对象。可以通过在配置类中重写configureMessageConverters方法来实现:

    @Configuration
    public class WebConfig implements WebMvcConfigurer {
        @Override
        public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
            converters.removeIf(converter -> converter instanceof StringHttpMessageConverter);
        }
    }
    

    注意:这样就会使用默认的HttpMessageConverter来处理返回值,而不会发生类型转换错误。

  2. 单独处理String类型返回值:在统一数据返回之前的处理过程中,可以检查返回值的类型。如果类型为String,则直接返回字符串给前端,而不进行HashMap到JSON的转换。可以通过自定义的统一数据返回处理类来实现:

    @ControllerAdvice
    public class GlobalExceptionHandler {
    
        @ExceptionHandler(Exception.class)
        @ResponseBody
        public Object handleException(Exception ex) {
            if (ex instanceof YourCustomException) {
                // 处理自定义异常逻辑
                return "Your custom error message";
            } else if (ex instanceof AnotherException) {
                // 处理另一个异常逻辑
                return "Another error message";
            } else {
                // 其他异常处理逻辑
                return "Generic error message";
            }
        }
    }
    

    注意:在上述示例中,根据数据类型进行不同的处理,并直接返回相应的字符串给前端。

通过以上方法,可以解决统一数据处理方法返回类型为String导致报错的问题,并根据需要进行特殊处理。请根据具体情况选择适合的解决方案。


结语

这就是本期博客的全部内容啦!如果有什么其他的问题无法自己解决,可以在评论区留言哦!

最后,如果你觉得这篇文章写的还不错的话或者有所收获的话,麻烦小伙伴们动动你们的小手,给个三连呗(点赞,评论✍,收藏),多多支持一下!各位的支持是我最大的动力,后期不断更新优质的内容来帮助大家,一起进步。那我们下期见!

【框架篇】统一数据格式返回_第2张图片


你可能感兴趣的:(Java,EE【进阶】,spring,boot,java,java-ee)