前言
统一返回值虽然很好用,但是在每个Controller曾的方法需要手动调用ResponseResult的静态方法,还是不够优雅,可以使用全局统一处理,统一到一个地方进行返回处理。
全局统一返回处理
处理类
package com.zsl.common.advice;
import com.zsl.common.annotation.NotResponseBody;
import com.zsl.common.http.ResponseResult;
import com.zsl.util.JsonUtils;
import org.springframework.core.MethodParameter;
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;
/**
* 全局处理返回数据
* @Author zsl
* @Date 2021/12/29 14:09
*/
@RestControllerAdvice(basePackages = "com.zsl.controller") //扫描的包
public class ResponseControllerAdvice implements ResponseBodyAdvice<Object> {
@Override
public boolean supports(MethodParameter methodParameter, Class<? extends HttpMessageConverter<?>> aClass) {
// 返回 true则执行 beforeBodyWrite方法,
// 返回类型不是 ResponseResult,且没有 @NotResponseBody注解,会执行
return !methodParameter.getParameterType().equals(ResponseResult.class) && !methodParameter.hasMethodAnnotation(NotResponseBody.class);
}
@Override
public Object beforeBodyWrite(Object o, MethodParameter methodParameter, MediaType mediaType, Class<? extends HttpMessageConverter<?>> aClass, ServerHttpRequest serverHttpRequest, ServerHttpResponse serverHttpResponse) {
// 若为 String类型,则直接返回 json字符串
if (methodParameter.getGenericParameterType().equals(String.class)) {
return JsonUtils.obj2Str(o);
}
return ResponseResult.success(o);
}
}
注解
当我们不希望被统一返回处理时,添加@NotResponseBody注解进行跳过处理。
package com.zsl.common.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* @Author zsl
* @Date 2022/2/17 11:07
* @Email 249269610@qq.com
*/
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface NotResponseBody {
}
例子
原先:
@RestController
public class XxxController {
@Autowired
XxxService xxxService;
@RequestMapping("xxx")
public ResponseResult xxx() {
return ResponseResult.success(xxxService.xxx());
}
}
现在:
@RestController
public class XxxController {
@Autowired
XxxService xxxService;
@RequestMapping("xxx")
public Xxx xxx() {
return xxxService.xxx();
}
}
具体的处理由ResponseControllerAdvice来进行统一处理,Controller只需要考虑返回给前端的数据
注意
- controller层的注解需要使用@RestController(复合注解), 也就是方法需要有@ResponseBody注解才能生效,只有@Controller注解不会经过全局统一返回处理
- @RestControllerAdvice,最好加上要扫描的包,对basePackages进行赋值