Springboot controller返回值使用注解形式Result

1,319 阅读1分钟

常规写法:

Result:

public class Result<T> {
    private String errorCode;

    private String msg;

    private T data;

    public Result(){}

    public Result(String errorCode,String msg){
        this.errorCode = errorCode;
        this.msg = msg;
    }

    public Result(String errorCode,String msg,T data){
        this.errorCode = errorCode;
        this.msg = msg;
        this.data = data;
    }

    public static Result SUCCESS(){
        return new Result("200","SUCCESS");
    }

    public static <T> Result SUCCESS(T data){
        return new Result("200","SUCCESS",data);
    }

    public static <T> Result FAILED(String errorCode,String msg){
        return new Result(errorCode,msg);
    }

    public String getErrorCode() {
        return errorCode;
    }

    public void setErrorCode(String errorCode) {
        this.errorCode = errorCode;
    }

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }

    public T getData() {
        return data;
    }

    public void setData(T data) {
        this.data = data;
    }
}

Controller:

    @GetMapping("/t2")
    public Result t2(){
        return Result.FAILED("100001","t2失败");
    }

使用注解:

1. 创建相应结果注解--ResponseResult
@Documented
@Target({ElementType.TYPE,ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface ResponseResult {
}
2. 构建Interceptor,Handler 处理@ResponseResult
public class ResponseResultInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        if(handler instanceof HandlerMethod){
            HandlerMethod handlerMethod = (HandlerMethod) handler;
            Class<?> clazz = handlerMethod.getBeanType();
            Method method = handlerMethod.getMethod();
            if (clazz.isAnnotationPresent(ResponseResult.class)){
                request.setAttribute(GrobalConfigProperties.RESPONSE_RESULT_ANN,clazz.getAnnotation(ResponseResult.class));
            }else {
                request.setAttribute(GrobalConfigProperties.RESPONSE_RESULT_ANN,method.getAnnotation(ResponseResult.class));
            }
        }
        return true;
    }
}

@Configuration
public class CommonMvcConfigurer implements WebMvcConfigurer {

    @Bean
    public ResponseResultInterceptor responseResultInterceptor(){
        return new ResponseResultInterceptor();
    }

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(responseResultInterceptor());
    }
}

  1. Handler
@ControllerAdvice
public class ResponseResultHandler implements ResponseBodyAdvice<Object> {
    @Override
    public boolean supports(MethodParameter methodParameter, Class<? extends HttpMessageConverter<?>> aClass) {
        ServletRequestAttributes requestAttributes = (ServletRequestAttributes)RequestContextHolder.getRequestAttributes();
        HttpServletRequest request = requestAttributes.getRequest();
        ResponseResult responseResult = (ResponseResult) request.getAttribute(GrobalConfigProperties.RESPONSE_RESULT_ANN);
        return responseResult == null ? false : true;
    }

    @Override
    public Object beforeBodyWrite(Object object, MethodParameter methodParameter, MediaType mediaType, Class<? extends HttpMessageConverter<?>> aClass, ServerHttpRequest serverHttpRequest, ServerHttpResponse serverHttpResponse) {
        if (object instanceof Result){
            return object;
        }
        return Result.SUCCESS(object);
    }
}

测试:

@RestController
@ResponseResult
@RequestMapping("/test1")
public class DemoController {

    @GetMapping("/t1")
    public void t1(){

    }

    @GetMapping("/t2")
    public Result t2(){
        return Result.FAILED("100001","t2失败");
    }

    @GetMapping("/t3")
    public List t3(){
        List<String> list = new ArrayList();
        list.add("1");
        list.add("2");
        return list;
    }
}