【Spring Boot】统一数据返回

07-11 1330阅读

目录

  • 统一数据返回
    • 一. 概念
    • 二.实现统一数据返回
      • 2.1 重写responseAdvice方法
      • 2.2 重写beforeBodyWriter方法
      • 三. 特殊类型-String的处理
      • 四. 全部代码

        统一数据返回

        一. 概念

        其实统一数据返回是运用了AOP(对某一类事情的集中处理)的思维,简单概括就是在我们进行前后端数据交互的时候,能够让后端的数据进行统一的打包封装,返回给前端,便于前后端的数据处理。

        二.实现统一数据返回

        其实统一数据返回非常简单,在实现时要加入类注解@ControllerAdvice(这是一个表示控制通知的注解,在接下来的统一异常处理也要运用到),在添加类注解后还要在实现ResponseBodyAdvice接口,然后重写接口的responseAdvice接口和beforeBodyWriter方法即可实现。

        1. 添加类注解@ControllerAdvice,实现接口ResponseBodyAdvice
        2. 重写responseAdvice方法
        3. 重写beforeBodyWriter方法
        4. 特殊数据类型特殊处理(String)

        2.1 重写responseAdvice方法

        responseAdvice方法如下:

        【Spring Boot】统一数据返回

        @Override
        public boolean supports(MethodParameter returnType, Class converterType) {
        	return true;
        }
        

        可以看到,重写该方法主要返回的是Boolean数据类型,返回false表示不执行统一返回,返回true表示对于所有的数据类型都进行数据统一返回。

        supports方法:判断是否要执行beforeBodyWrite方法.true为执行,false不执行.通过该方法可以

        选择哪些类或哪些方法的response要进行处理,其他的不进行处理

        2.2 重写beforeBodyWriter方法

        beforeBodyWriter方法如下:

        【Spring Boot】统一数据返回

        beforeBodyWrite方法:对response方法进行具体操作处理

        其中的参数body最为重要,如果想要对统一后的数据进行格式的转换,直接转换body的格式就行,因为这里的body代指了所有的数据格式。

        三. 特殊类型-String的处理

        在经过多次不同的数据类型测试后发现,其它类型就可以顺利返回,而String类型却返回不正确。

        对于String的数据类型如果想要返回,我们要先引入ObjectMapper,通过调用ObjeceMapper的writeValueAsString()方法来把body的数据格式给转换成Json格式,然后再次进行统一返回即可。

        进行数据转换的代码如下:

        private static ObjectMapper mapper = new ObjectMapper();
        @Override
        public Object beforeBodyWrite(Object body, MethodParameter returnType,MediaType selectedContentType, Class selectedConverterType,
         ServerHttpRequestrequest, ServerHttpResponse response) {
         
        	//如果返回结果为String类型, 使⽤SpringBoot内置提供的Jackson来实现信息的序列化
        	if (body instanceof String){
        		return mapper.writeValueAsString(Result.success(body));
        	}
        	
        }
        

        四. 全部代码

        import com.example.demo.model.Result;
        import com.fasterxml.jackson.databind.ObjectMapper;
        import lombok.SneakyThrows;
        import lombok.extern.slf4j.Slf4j;
        import org.springframework.core.MethodParameter;
        import org.springframework.http.MediaType;
        import org.springframework.http.server.ServerHttpRequest;
        import org.springframework.http.server.ServerHttpResponse;
        import org.springframework.web.bind.annotation.ControllerAdvice;
        import
        org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice;
        @Slf4j
        @ControllerAdvice
        public class ResponseAdvice implements ResponseBodyAdvice {
        	
        	private static ObjectMapper mapper = new ObjectMapper();
        		
        	@Override
        	public boolean supports(MethodParameter returnType, Class converterType) {
        		return true;
        	}
        	
        	@SneakyThrows
        	@Override
        	public Object beforeBodyWrite(Object body, MethodParameter returnType,MediaType selectedContentType, Class selectedConverterType, ServerHttpRequest
        	request, ServerHttpResponse response) {
        	
        		//返回结果更加灵活
        		if (body instanceof Result){
        			return body;
        		}
        		
        		//如果返回结果为String类型, 使⽤SpringBoot内置提供的Jackson来实现信息的序列化
        		if (body instanceof String){
        			return mapper.writeValueAsString(Result.success(body));
        		}
        		
        		return Result.success(body);
        	}
        }
        
        1. 方便前端程序员更好的接收和解析后端数据接口返回的数据
        2. 降低前端程序员和后端程序员的沟通成本,按照某个格式实现就可以了,因为所有接口都是这样返回

          的.

        3. 有利于项目统⼀数据的维护和修改.
        4. 有利于后端技术部门的统⼀规范的标准制定,不会出现稀奇古怪的返回内容.
VPS购买请点击我

文章版权声明:除非注明,否则均为主机测评原创文章,转载或复制请以超链接形式并注明出处。

目录[+]