SpringBoot实现RequestBodyAdvice和ResponseBodyAdvice接口

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 对象,不进行任何修改
    }
}

本文作者:盗梦笔记

本文链接:https://www.cnblogs.com/zhaojinhui/p/17982907

版权声明:本作品采用zhaojh许可协议进行许可。

posted @   盗梦笔记  阅读(495)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起