首页 > 其他分享 >SpringBoot实现RequestBodyAdvice和ResponseBodyAdvice接口

SpringBoot实现RequestBodyAdvice和ResponseBodyAdvice接口

时间:2024-01-23 17:14:56浏览次数:32  
标签:http SpringBoot RequestBodyAdvice springframework server reactive ResponseBodyAd

Spring Boot 提供了一种机制,允许开发者在请求体(RequestBody)和响应体(ResponseBody)被处理之前和之后执行自定义逻辑。这通过 RequestBodyAdvice 和 ResponseBodyAdvice 接口实现。

RequestBodyAdvice:此类用于在请求体被处理之前执行自定义逻辑。

例如,你可以使用它来解析请求体,或者在请求体被转换为 Java 对象之前对其进行修改。

ResponseBodyAdvice:此类用于在响应体被处理之后执行自定义逻辑。

例如,你可以使用它来修改响应体,或者在响应体被写入 HTTP 响应之前对其进行修改。

要使用这些 Advice,你需要实现相应的接口,并使用 Spring 的 AOP(面向切面编程)功能将其注册为一个切面(Aspect)。

以下是一个简单的示例,展示如何创建一个 RequestBodyAdvice:

import org.springframework.http.MediaType;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.http.server.reactive.ServerHttpResponse;
import org.springframework.web.server.ServerWebExchange;
import org.springframework.web.server.WebFilter;
import org.springframework.web.server.WebFilterChain;
import org.springframework.web.server.adapter.WebHttpHandlerBuilder;
import org.springframework.web.server.handler.WebHandler;
import org.springframework.web.server.ServerWebExchange;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.http.server.reactive.ServerHttpResponse;
import org.springframework.http.server.reactive.ServerHttpResponseDecorator;
import org.springframework.http.server.reactive.ServerHttpResponseOutput;
import org.springframework.http.server.reactive.ServerResponse;
import org.springframework.stereotype.Component;
import org.springframework.webflux.core.*;
import org.springframework.webflux.http.*;
import org.springframework.webflux.*;
import org.springframework.*;
import org.springframework.*;
import org.*;

@Component
public class CustomRequestBodyAdvice implements RequestBodyAdvice<MyDto> {
    @Override
    public Mono<MyDto> beforeBodyRead(ServerHttpRequest request, MediaType mediaType, 
        Class<? extends MyDto> type, ServerWebExchange exchange) {
        // 在请求体被读取之前执行的逻辑
        return Mono.just(new MyDto()); // 示例逻辑:返回一个新的 MyDto 对象
    }

    @Override
    public BodySpec<MyDto> afterBodyRead(BodySpec<MyDto> bodySpec, 
        ServerWebExchange exchange) {
        // 在请求体被读取之后执行的逻辑
        return bodySpec; // 示例逻辑:返回原始的 BodySpec 对象,不进行任何修改
    }

    @Override
    public Mono<Void> beforeBodyWritten(Mono<MyDto> body, MediaType mediaType, 
        ServerWebExchange exchange, WebRequest缀> headers) {
        // 在响应体被写入之前执行的逻辑
        return Mono.empty(); // 示例逻辑:返回一个空的 Mono 对象,不进行任何修改
    }
}

标签:http,SpringBoot,RequestBodyAdvice,springframework,server,reactive,ResponseBodyAd
From: https://www.cnblogs.com/zhaojinhui/p/17982907

相关文章

  • SpringBoot是什么
    SpringBoot帮我们简单、快速地创建一个独立的、生产级别的Spring应用(说明:SpringBoot底层是Spring)大多数SpringBoot应用只需要编写少量配置即可快速整合Spring平台以及第三方技术特性:快速创建独立Spring应用SSM:导包、写配置、启动运行直接嵌入Tomcat、J......
  • 关于springboot 域认证
    最近项目,客户要求实现域认证,然后登录。网上资料自己整理一下,以备后续使用;springboot域认证,我采用的是ldap方式认证。1.引入插件:<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-ldap</artifactId......
  • shardingsphere springboot application.yml配置
    shardingsphere springbootapplication.yml配置 spring:sharding-sphere:datasource:names:mastermaster:type:com.zaxxer.hikari.HikariDataSourcedriver-class-name:com.mysql.cj.jdbc.Driverjdbc-url:jdbc:mysql:......
  • springboot+mybtais+mysql
    一、通过maven引入相应的包pom.xml<?xmlversion="1.0"encoding="UTF-8"?><projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http......
  • Springboot学习第二天
    今天的学习内容是如何在项目中设计统一响应接口返回值,达到统一的格式1.响应实体我们首先要定义一个公共的接口响应实体,以后所有的接口返回值,都是返回的这个公共响应实体。这样做的好处是可以统一返回值的风格,编译接口的维护。需要包含3个关键的成员变量:状态码返回信息数......
  • 在 SpringBoot 项目中使用 Mybatis 打印 SQL 日志
    前言我们在项目中使用的持久层框架大部分都是mybatis,如果在日志中能打印sql的话,对于我们排查问题会更加方便。第一种方式:修改mybatis配置修改配置mybatis:configuration:log-impl:org.apache.ibatis.logging.slf4j.Slf4jImpllogging:level:com.imooc.p......
  • springboot+vue--注册
    ***在UserController中声明一个(/register),接口中包括两个功能://用户名是否已被占用//注册**​publicResultregister(Stringusername,Stringpassword){}***在UserService(接口)中,实现两个方法:**​publicUserfindByUsername(Stringusername){}//根据用户......
  • Java21 + SpringBoot3集成easy-captcha实现验证码显示和登录校验
    目录前言相关技术简介easy-captcha实现步骤引入maven依赖定义实体类定义登录服务类定义登录控制器前端登录页面实现测试和验证总结附录使用Session缓存验证码前端登录页面实现代码前言近日心血来潮想做一个开源项目,目标是做一款可以适配多端、功能完备的模板工程,包含后台管理系......
  • springboot 读取配置7种方式
    1.概述通过了解springboot加载配置,可以更方便地封装自定义Starter。在SpringBoot中,可以使用以下6种方式读取yml、properties配置:使用@Value注解:读取springboot全局配置文件单个配置。使用Environment接口:通过Environment接口动态获取配置。(将yml全部数据封装到Environ......
  • Idea 创建SpringBoot小计
    创建spring工程之后maven依赖包拉不下来去官网下载maven并配置maven环境变量  下载地址:http://maven.apache.org/download.cgi解压后,修改mavensetting配置文件,增加国内镜像地址添加阿里云国内镜像  idea配置本地maven配置如下图  之后应该就......