springboot统一拦截包装接口返回值

这篇具有很好参考价值的文章主要介绍了springboot统一拦截包装接口返回值。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1、作用

代替手动封装每个接口的返回值,否则每个有返回值的controller接口,都需要手动使用Resonse类包装返回结果

2、实现

方法返回值handler,需要实现接口HandlerMethodReturnValueHandler,并重写supportsReturnType和handleReturnValue方法。只有在supportsReturnType方法返回值为true的情况下才会执行handleReturnValue方法。

@Service
public class ResponseReturnValueHandler implements HandlerMethodReturnValueHandler {

    /**
     * 当前handler是否能够处理 MethodParameter returnType
     *
     * @param returnType
     * @return
     */
    @Override
    public boolean supportsReturnType(MethodParameter returnType) {
        ApiResponseBody methodAnnotation = returnType.getMethodAnnotation(ApiResponseBody.class);
        if (Objects.nonNull(methodAnnotation)) {
            ApiResponseBodyType type = methodAnnotation.type();
            if (ApiResponseBodyType.HTML.equals(type) || ApiResponseBodyType.XML.equals(type) || ApiResponseBodyType.IGNORE.equals(type)) {
                return false;
            }
        }
        return true;
    }

    /**
     * 处理返回结果
     *
     * @param returnValue
     * @param returnType
     * @param mavContainer
     * @param webRequest
     * @throws Exception
     */
    @Override
    public void handleReturnValue(Object returnValue, MethodParameter returnType, ModelAndViewContainer mavContainer, NativeWebRequest webRequest) throws Exception {
        // 使用Result包装返回值returnValue
        Result jsonResult = Result.success(returnValue);
        HttpServletResponse response = webRequest.getNativeResponse(HttpServletResponse.class);
        PrintWriter writer = response.getWriter();
        writer.write(JsonHelper.parseToJson(jsonResult));
        writer.flush();
        writer.close();
    }
}

包装器wrapper(把处理器handler加入到RequestMappingHandlerAdapter的list中)

@Configuration
public class RequestMappingHandlerAdapterWrapper {
    /**
     * 解析参数和返回结果
     */
    @Autowired
    private RequestMappingHandlerAdapter requestMappingHandlerAdapter;

    /**
     * 自定义的返回值处理器
     */
    @Autowired
    private ResponseReturnValueHandler responseReturnInterceptor;

    @PostConstruct
    public void init() {
        List<HandlerMethodReturnValueHandler> originalHandlers = new ArrayList<>();
        originalHandlers.add(responseReturnInterceptor);
        requestMappingHandlerAdapter.setReturnValueHandlers(originalHandlers);
    }
}

方法返回值类型注解(此注解使用在controller的方法上,用来标识接口返回的数据类型,可以有json、html或者ingore),只要不是ignore、html或xml,就当做json,在方法handleReturnValue中使用Result来统一包装。文章来源地址https://www.toymoban.com/news/detail-540835.html

@Getter
public enum ApiResponseBodyType {
    /**
     * JSON序列化格式
     */
    JSON,
    HTML,
    IGNORE,
    XML
}

到了这里,关于springboot统一拦截包装接口返回值的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Spring Boot】拦截器与统一功能处理

    博主简介:想进大厂的打工人 博主主页: @xyk: 所属专栏: JavaEE进阶   上一篇文章我们讲解了Spring AOP是一个基于面向切面编程的框架,用于将某方面具体问题集中处理,通过代理对象来进行传递,但使用原生Spring AOP实现统一的拦截是非常繁琐的。而在本节,我们将使用一种

    2024年02月14日
    浏览(39)
  • Spring Boot 优雅实现统一数据返回格式+统一异常处理+统一日志处理

            在我们的项目开发中,我们都会对数据返回格式进行统一的处理,这样可以方便前端人员取数据,当然除了正常流程的数据返回格式需要统一以外,我们也需要对异常的情况进行统一的处理,以及项目必备的日志。         在项目开发中返回的是json格式的数据

    2024年01月19日
    浏览(43)
  • Spring Boot 统一数据返回格式 分析 和 处理

    目录 实现统一数据格式  测试   原因分析  解决方案 🎥 个人主页:Dikz12 📕格言:吾愚多不敏,而愿加学 欢迎大家👍点赞✍评论⭐收藏 统⼀的数据返回格式使⽤ @ControllerAdvice 和 ResponseBodyAdvice 的⽅式实现; @ControllerAdvice : 表⽰控制器通知类. 比如:添加类 ResponseAdvic

    2024年04月08日
    浏览(50)
  • 接口返回响应,统一封装(ResponseBodyAdvice + Result)(SpringBoot)

    接口的返回响应,封装成统一的数据格式,再返回给前端。 对于SpringBoot项目,接口层基于 SpringWeb ,也就是 SpringMVC 。 为了使接口的返回结果数据更加规范化,便于接口测试和前端处理,需要以统一的格式来返回数据; 为了不在每一个接口里面,都写一段返回数据封装的代

    2024年02月08日
    浏览(59)
  • 【Spring Boot统一功能处理】统一异常处理,统一的返回格式,@ControllerAdvice简单分析,即将走进SSM项目的大门! ! !

    前言: 大家好,我是 良辰丫 ,在上一篇文章中我们已经学习了一些统一功能处理的相关知识,今天我们继续深入学习这些知识,主要学习统一异常处理,统一的返回格式,@ControllerAdvice简单分析.💌💌💌 🧑个人主页:良辰针不戳 📖所属专栏:javaEE进阶篇之框架学习 🍎励志语句:生

    2024年02月16日
    浏览(42)
  • Spring Boot 接口统一前缀

    需求如题,想给一个 spring boot 项目的所有请求路径添加统一前缀,可以通过 context-path 来配置。但是在同时存在静态资源和 Controller 接口的项目中,如果希望静态资源从根路径访问,并且所有接口拥有统一路径前缀,则需要通过 Spring 层面来解决这个问题(context-path 是 web 容

    2024年02月08日
    浏览(36)
  • 【规范】SpringBoot接口返回结果及异常统一处理,这样封装才优雅

    博友的需求就是我最大的动力 博友一说话,本狗笑哈哈。 博友要我写啥,我就写啥 。 特来一篇关于 SpringBoot接口返回结果及异常统一处理 ,虽说封不封装都能用,但咱后端也得给前端小姐姐留个好印象不是。项目前后端分离, 规范的数据传输格式,让REST风格的API具有简单

    2024年02月08日
    浏览(43)
  • 一站式统一返回值封装、异常处理、异常错误码解决方案—最强的Sping Boot接口优雅响应处理器

    作者:京东物流 覃玉杰 Graceful Response是一个Spring Boot体系下的优雅响应处理器,提供一站式统一返回值封装、异常处理、异常错误码等功能。 使用Graceful Response进行web接口开发不仅可以节省大量的时间,还可以提高代码质量,使代码逻辑更清晰。 强烈推荐你花3分钟学会它!

    2024年02月03日
    浏览(56)
  • Spring Boot入门(23):记录接口日志再也不难!用AOP和自定义注解给Spring Boot加上日志拦截器!

            在上两期中,我们着重介绍了如何集成使用 Logback 与 log4j2 日志框架的使用,今天我们讲解的主题依旧跟日志有关,不过不是使用何种开源框架,而是自己动手造。         Spring的核心之一AOP;AOP翻译过来叫面向切面编程, 核心就是这个切面. 切面表示从业务逻辑中

    2024年02月11日
    浏览(56)
  • Spring Boot 3自定义注解+拦截器+Redis实现高并发接口限流

    在当今互联网应用开发中,高并发访问是一个常见的挑战。为了保障系统的稳定性和可靠性,我们需要对接口进行限流,防止因过多的请求导致系统崩溃。 本文将介绍如何利用Spring Boot 3中的自定义注解、拦截器和Redis实现高并发接口限流,帮助程序员解决这一挑战。 1. 自定

    2024年04月28日
    浏览(49)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包