Spring Boot统一格式返回数据的几种方式

本文介绍在Spring框架中实现统一响应格式的两种方法:通过自定义ResponseHandler类实现ResponseBodyAdvice接口,以及通过RestReturnValueHandlerConfigurer配置类自定义结果处理器。这些方法可以帮助开发者在不同API响应中保持一致的数据包装。

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

  有些时候呢,我们需要统一格式进行返回,之前可能会定义某个实体类在每个方法的响应都是用这个实体类然后包含响应值,其实spring呢,可以有挺多种无侵入的统一包装方法。

  第一种:

@RestControllerAdvice
public class ResponseHandler implements ResponseBodyAdvice<Object> {

    @Override
    public boolean supports(MethodParameter methodParameter, Class<? extends HttpMessageConverter<?>> aClass) {
      //这里可以实现自己的逻辑 判断是否包装
          return true;
    }

    @Override
    public Object beforeBodyWrite(Object o, MethodParameter methodParameter,
                                  MediaType mediaType, Class<? extends HttpMessageConverter<?>> aClass,
                                  ServerHttpRequest serverHttpRequest, ServerHttpResponse serverHttpResponse) {
        if (o instanceof String) {
           //接口方法返回值为string的需要处理一下 因为响应的type为text  如果设置了响应为Json可以忽略
        }
        return o;
    }
}    

  第二种:

@Configuration
public class RestReturnValueHandlerConfigurer implements InitializingBean {
@Autowired private RequestMappingHandlerAdapter handlerAdapter; @Override public void afterPropertiesSet() { List<HandlerMethodReturnValueHandler> list = handlerAdapter.getReturnValueHandlers(); List<HandlerMethodReturnValueHandler> newList = new ArrayList<>(); if (null != list) { for (HandlerMethodReturnValueHandler valueHandler: list) { if (valueHandler instanceof RequestResponseBodyMethodProcessor) { HandlerMethodReturnValueHandlerProxy proxy = new HandlerMethodReturnValueHandlerProxy(valueHandler); newList.add(proxy); } else { newList.add(valueHandler); } } } handlerAdapter.setReturnValueHandlers(newList); } } // 实现HandlerMethodReturnValueHandler接口 完成自己的结果处理器 public class HandlerMethodReturnValueHandlerProxy implements HandlerMethodReturnValueHandler { private HandlerMethodReturnValueHandler proxyObject; public HandlerMethodReturnValueHandlerProxy(HandlerMethodReturnValueHandler proxyObject) { this.proxyObject = proxyObject; } @Override public boolean supportsReturnType(MethodParameter returnType) { return proxyObject.supportsReturnType(returnType); } @Override public void handleReturnValue(Object returnValue, MethodParameter returnType, ModelAndViewContainer mavContainer, NativeWebRequest webRequest) throws Exception { //这里实现自己的逻辑 proxyObject.handleReturnValue(resultValue, returnType, mavContainer, webRequest); } }

  上述两种方式都是可以实现自己的数据包装,其实自己实现切面来进行包装也是可以的。根据自己的业务类型,具体实现即可。不过都要注意响应头格式,异常等处理,还有要记得处理第三方带的接口的响应,比如spring的监控包,swagger-ui之类的接口。

转载于:https://www.cnblogs.com/meetzy/p/10039952.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值