首页 > 其他分享 >spring boot 拦截返回值并进行包装

spring boot 拦截返回值并进行包装

时间:2024-04-21 20:13:29浏览次数:20  
标签:body http converter spring boot springframework 返回值 org public

Spring Boot 3.1.10

JAVA 17

---

 

序章

统一接口的返回值格式:ResultVO 对象。

拦截 Controller 的请求,对于 返回值不是 ResultVO 对象的,包装成 ResultVO 对象,返回 null(void) 的除外。

 

实现方式

接口 ResponseBodyAdvice

+

注解 @ControllerAdvice。

 

代码:ResponseBodyProcess.java

import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice;

@ControllerAdvice
@Slf4j
public class ResponseBodyProcess implements ResponseBodyAdvice<Object> {
    @Override
    public boolean supports(MethodParameter returnType, Class<? extends HttpMessageConverter<?>> converterType) {
        return true;
    }

    @Override
    public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType,
                                  Class<? extends HttpMessageConverter<?>> selectedConverterType,
                                  ServerHttpRequest request, ServerHttpResponse response) {
        if (Objects.isNull(body)) {
            return body;
        } else if (body instanceof ResultVO) {
            log.trace("todo del return body={}, uri={}", body, request.getURI());
        } else {
            log.debug("重新包装返回值 body:class={}", body.getClass());
            return ResultVO.success(AppConstant.REQUEST_OK, body);
        }
        return body;
    }
}

 

进一步:配置 MessageConverters

接口 WebMvcConfigurer

方法 void configureMessageConverters(List<HttpMessageConverter<?>> converters)。

返回 String 时,会报 异常。

解释见 参考文档#2。

 

默认的 converters:

converters=[
org.springframework.http.converter.ByteArrayHttpMessageConverter@141aba65, 
org.springframework.http.converter.StringHttpMessageConverter@b5312df, 
org.springframework.http.converter.StringHttpMessageConverter@3356ff58, 
org.springframework.http.converter.ResourceHttpMessageConverter@b55f5b7, 
org.springframework.http.converter.ResourceRegionHttpMessageConverter@2aa6bbad, 
org.springframework.http.converter.support.AllEncompassingFormHttpMessageConverter@6b2ef50e, 
org.springframework.http.converter.json.MappingJackson2HttpMessageConverter@4300e240, 
org.springframework.http.converter.json.MappingJackson2HttpMessageConverter@6f867b0c
]

ben发布于博客园

代码:AppWebConfig.java

import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class AppWebConfig implements WebMvcConfigurer {

    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        // 配合 ResponseBodyProcess 使用:返回 String 时
        converters.add(0, new MappingJackson2HttpMessageConverter());
    }

}

ben发布于博客园

测试接口

代码:

TestController.java
 @RestController
@RequestMapping("api/test")
@Slf4j
public class TestController {

    @GetMapping("get/string")
    public String get() {
        log.info("getString");
        return "abc";
    }

    @GetMapping("get/void")
    public void getVoid() {
        log.info("getVoid");
    }

    @GetMapping("get/int")
    public int getInt() {
        log.info("getInt");
        return 1000;
    }

    @GetMapping("get/boolean")
    public boolean getBoolean() {
        log.info("getBoolean");
        return true;
    }

    @GetMapping("get/int/ex")
    public int getIntEx() {
        log.info("getInt");
        long ex = 123/0;
        return 1000;
    }

}

 

补充说明

1、对于 登录、退出登录 等 不是 Controller 中的接口,不能拦截。

2、除了 @ControllerAdvice 注解,还有一个 @RestControllerAdvice 注解。

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@ControllerAdvice
@ResponseBody
public @interface RestControllerAdvice {
    // ...
}

3、interface ResponseBodyAdvice<T>

源码说明:

Allows customizing the response after the execution of an @ResponseBody or a ResponseEntity controller method

but before the body is written with an HttpMessageConverter.

Implementations may be registered directly with RequestMappingHandlerAdapter and ExceptionHandlerExceptionResolver

or more likely annotated with @ControllerAdvice in which case they will be auto-detected by both.
Since: 4.1
Author: Rossen Stoyanchev

 

---END---

 

本文链接:

https://www.cnblogs.com/luo630/p/18147317

ben发布于博客园

参考资料

1、spring boot 拦截器请求返回值 springboot拦截controller返回值
https://blog.51cto.com/u_14230/6286912

2、ResponseBodyAdvice、String返回值报cannot be cast to java.lang.String的解决办法
勤而思
于 2021-06-30 18:33:07 发布
https://blog.csdn.net/wen1652166675/article/details/118367098

3、

 

ben发布于博客园

ben发布于博客园

 

标签:body,http,converter,spring,boot,springframework,返回值,org,public
From: https://www.cnblogs.com/luo630/p/18147317

相关文章

  • Spring Cache 介绍
    SpringCache是Spring提供的的缓存解决方案,它并非是一个具体的缓存实现,而是和JSR107类似的一套缓存规范,基于注解并与Spring的无缝集成。本文主要介绍其基本概念及简单使用。1、简介1.1、SpringCache概述SpringCache是Spring提供的一种缓存抽象机制,用于简化应用中......
  • 短链接口设计&禁用Springboot执行器端点/env的安全性
    短链接口设计//短链接服务跳转方式,实现短链接转长链接的请求。@GetMapping("/{code}")publicStringredirectUrl(@PathVariable("code")Stringcode){return"redirect:"+shortUrl.getLongUrl();}禁用Springboot执行器端点/env的安全性#关闭健康检查不安全接口end......
  • Spring-Retry框架简单使用
    前言Spring-Retry框架是Spring自带的功能,具备间隔重试、包含异常、排除异常、控制重试频率等特点,是项目开发中很实用的一种框架。SpringCloudConfig请求配置中心服务器时就使用到了此功能,具体可以看ConfigServicePropertySourceLocator。使用添加依赖底层使用AOP实现的,......
  • 基于SpringBoot+Vue毕业生信息招聘平台系统
    需求分析3.1技术可行性:技术背景毕业生信息招聘平台是在Windows操作系统中进行开发运用的,而且目前PC机的各项性能已经可以胜任普通网站的web服务器。系统开发所使用的技术也都是自身所具有的,也是当下广泛应用的技术之一。系统的开发环境和配置都是可以自行安装的,系统使用Java开......
  • 计算机毕业设计源码-基于 SpringBoot 开发的班级综合测评系统研究与实现
    技术栈开发语言:Java框架:springbootJDK版本:JDK1.8服务器:tomcat7数据库:mysql5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包:Maven3.3.9浏览器:谷歌浏览器3.需求分析用户需求分析根据账号登陆进入班级综合测评管理系统,系统根据角色展示相应......
  • springboot启动原理
     启动类上的注解,会扫描路径下的类进容器进行实例化。这样访问时springmvc的dispa就可以访问到这个类了。newDispatcherServlet(webapplication)springmvc需要一个web容器。这个容器参数,在startTomcat(applicationContext)方法里面传入。 ......
  • NanoPi-NEO 全志H3移植Ubuntu 22.04 LTS、u-boot、Linux内核/内核树、mt7601u USB-Wi-
    前言想在NanoPi-NEO上开发屏幕驱动,但是看了下文件目录发现没有内核树,导致最基础的file_operations结构体都无法使用,于是寻找内核树安装方法。但官方提供的内核为4.14太旧了apt找不到对应的linux-source版本(其实后面发现不需要用apt,可以在kernel.org上下载,但反正都装了那就当学习......
  • Spring Cloud
    SpringCloud微服务概述微服务可以在“自己的程序”中运行,并通过“轻量级设备与HTTP型API进行沟通”。关键在于该服务可以在自己的程序中运行。通过这一点我们就可以将服务公开与微服务架构(在现有系统中分布一个API)区分开来。在服务公开中,许多服务都可以被内部独立进程所限......
  • ASP.NET MVC4.0+EF+LINQ+bui+bootstrap+网站+角色权限管理系统(1)
    ASP.NETMVC4.0+EF+LINQ+bui+bootstrap+网站+角色权限管理系统(1) 本系列的的角色权限管理主要采用Dotnet MVC4工程内置的权限管理模块Simplemembership实现,主要有关文件是InitializeSimpleMembershipAttribute.cs和AccountModels.cs下面是对这两个文件的了解和改造 WebSe......
  • Spring Boot 启动原理
    SpringBoot启动原理SpringBoot大大简化了我们的开发配置,节省了大量的时间,确实比较方便。但是对于新手来说,如果不了解个中原理,难免会遇到坑。本文作者将带领大家走近神秘的SpringBoot,一步步破开它的神秘面纱,探索SpringBoot的启动原理。开发任何基于SpringBoot的项目......