ResponseHandler.java 1.48 KB
package com.myxrk.rbac.aspect;

import com.myxrk.rbac.result.Result;
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.lang.NonNull;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice;

import java.util.Collections;
import java.util.List;

@ControllerAdvice
public class ResponseHandler implements ResponseBodyAdvice<Object> {

    @Override
    public boolean supports(@NonNull MethodParameter returnType, @NonNull Class converterType) {
        // 对所有Controller的返回值进行拦截
        return true;
    }

    @Override
    public Object beforeBodyWrite(Object body, @NonNull MethodParameter returnType, @NonNull MediaType selectedContentType,
                                  @NonNull Class selectedConverterType, @NonNull ServerHttpRequest request, @NonNull ServerHttpResponse response) {
        // 如果已经是Result类型,直接返回
        if (body instanceof Result) {
            return body;
        }

        // 如果返回值是List类型,直接封装
        if (body instanceof List) {
            return Result.success((List<?>) body);
        }

        // 如果返回值不是List类型,将其封装为单元素的List
        return Result.success(Collections.singletonList(body));
    }
}