spring自定义结果集封装

本文介绍如何在Spring MVC中自定义响应结果封装,通过创建自定义返回结果类和处理类,实现对所有响应结果的统一包装,排除特定URL路径,以适应不同业务需求。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.先自定义返回结果类

public class Result<T> implements Serializable {

    private static final long serialVersionUID = -415877140189946393L;

    private T data;

    public T getData() {
        return data;
    }

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

    public static <T> Result<T> SUCCESS(T data){
        Result<T> result = new Result<>();
        result.setData(data);
        return result;
    }
}

2.自定义返回处理类

public class ResponseBodyWrapHandler implements HandlerMethodReturnValueHandler {

    private HandlerMethodReturnValueHandler handlerMethodReturnValueHandler;

    /**
     * 用于过滤一些jar包中自带的uri
     * */
    private String[] filterUrls = {"/index" , "/health"};

    private final AntPathMatcher pathMatcher = new AntPathMatcher();

    public ResponseBodyWrapHandler(HandlerMethodReturnValueHandler handlerMethodReturnValueHandler) {
        this.handlerMethodReturnValueHandler = handlerMethodReturnValueHandler;
    }

    @Override
    public boolean supportsReturnType(MethodParameter returnType) {
        return true;
    }

    @Override
    public void handleReturnValue(Object returnValue, MethodParameter returnType, ModelAndViewContainer mavContainer, NativeWebRequest webRequest) throws Exception {
        if(webRequest instanceof ServletWebRequest && !(returnValue instanceof Result)){
            ServletWebRequest servletWebRequest = (ServletWebRequest) webRequest;
            HttpServletRequest request = (HttpServletRequest) servletWebRequest.getNativeRequest();
            if(!isFilter(request.getServletPath())){
                // 是web数据并且不是result类不进行封装返回
                returnValue = Result.SUCCESS(returnValue);
            }
        }
        this.handlerMethodReturnValueHandler.handleReturnValue(returnValue , returnType , mavContainer , webRequest);
    }

    private Boolean isFilter(String requestUri){
        for (String filterUrl : filterUrls) {
            if(pathMatcher.match(filterUrl , requestUri)){
                return true;
            }
        }
        return false;
    }
}

3.替换原有默认的RequestResponseBodyMethodProcessor

@Configuration
public class ResponseBodyWrapFactoryBean implements InitializingBean {

    @Autowired
    private RequestMappingHandlerAdapter requestMappingHandlerAdapter;

    @Override
    public void afterPropertiesSet() throws Exception {
        // 获取SpringMvc的ReturnValueHandlers
        List<HandlerMethodReturnValueHandler> returnValueHandlers = requestMappingHandlerAdapter.getReturnValueHandlers();
        if (CollectionUtil.isNotEmpty(returnValueHandlers)) {
            // 新建一个List来保存替换后的Handler的List
            List<HandlerMethodReturnValueHandler> returnValueHandlerList = CollectionUtil.newArrayList(returnValueHandlers);
            // 循环遍历找出RequestResponseBodyMethodProcessor
            for (HandlerMethodReturnValueHandler returnValueHandler : returnValueHandlerList) {
                if (returnValueHandler instanceof RequestResponseBodyMethodProcessor) {
                    // 创建定制的Json格式处理Handler
                    ResponseBodyWrapHandler responseBodyWrapHandler = new ResponseBodyWrapHandler(returnValueHandler);
                    // 使用定制的Json格式处理Handler替换原有的RequestResponseBodyMethodProcessor
                    int index = returnValueHandlerList.indexOf(returnValueHandler);
                    returnValueHandlerList.set(index, responseBodyWrapHandler);
                    break;
                }
            }
            // 重新设置SpringMVC的ReturnValueHandlers
            requestMappingHandlerAdapter.setReturnValueHandlers(returnValueHandlerList);
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值