requestbodyadvice 是 spring mvc 用于拦截 json 请求体反序列化的扩展接口,适用于全局解密(beforebodyread)和篡改校验(afterbodyread),需注册为 bean 且仅对 @requestbody 生效。

RequestBodyAdvice 是什么,适合做什么
RequestBodyAdvice 是 Spring MVC 提供的一个扩展接口,用于在 @RequestBody 参数被反序列化为 Java 对象之前或之后,对 HTTP 请求体(如 JSON)进行拦截处理。它不适用于表单提交(application/x-www-form-urlencoded)或文件上传(multipart/form-data),只对 application/json 等可被 HttpMessageConverter 处理的请求体生效。
实现全局解密:在 readBefore 方法中解密原始字节流
典型场景是前端将 JSON 加密(如 AES)后发送,后端需在绑定前自动解密。关键在于重写 supports() 判断是否介入、beforeBodyRead() 拦截原始 InputStream 并返回解密后的流。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 继承
RequestBodyAdviceAdapter(更简洁,只需重写关心的方法) - 在
beforeBodyRead()中读取原始InputStream,解密字节,构造新的ServletInputStream(需用ByteArrayInputStream包装) - 注意:必须返回非 null 的
InputStream,否则会跳过后续反序列化 - 解密失败时建议抛出
HttpMessageNotReadableException,便于统一异常处理
实现篡改校验:在 afterBodyRead 方法中验证业务字段一致性
比如签名验签、时间戳防重放、必填字段存在性检查等逻辑,适合放在 afterBodyRead() —— 此时对象已成功反序列化,但控制器方法尚未执行,可安全访问字段并抛出校验异常。
- 在
afterBodyRead()中获取反序列化后的对象,调用自定义校验器(如基于注解或规则引擎) - 校验失败时抛出
MethodArgumentNotValidException或自定义运行时异常(配合@ControllerAdvice统一响应) - 避免在此修改对象字段(虽技术可行,但语义不清;建议用
@Valid+Validator更规范) - 若需记录原始加密内容用于审计,可在
beforeBodyRead()中缓存解密前字节数组,并通过 ThreadLocal 传递到afterBodyRead()
注册与注意事项
RequestBodyAdvice 需声明为 Spring Bean 才能生效,且默认全局启用。可通过 @Order 控制多个 Advice 的执行顺序。
- 添加
@Component或手动@Bean注册 - 确保目标 Controller 方法参数明确标注
@RequestBody,否则 Advice 不触发 - 如果用了 WebFlux,对应的是
WebMvcConfigurer不适用,需换用ServerWebExchange相关机制 - 调试时可开启
logging.level.org.springframework.web.servlet.mvc.method.annotation=DEBUG查看 Advice 是否被调用
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










