Spring统一修改Controller的RequestBody

发布时间:2026/10/21 4:07:07
Spring统一修改Controller的RequestBody 我们编写RestController时有可能多个接口使用了相同的RequestBody在一些场景下需求修改传入的RequestBody的值如果是每个controller中都去修改代码会比较繁琐最好的方式是在一个地方统一修改比如将header中的某个值赋值给RequestBody对象的某个属性。 示例项目 https://github.com/qihaiyan/springcamp/tree/master/spring-modify-request-body一、概述在spring中可以使用RequestBodyAdviceAdapter修改RestController的请求参数。二、自定义 RequestBodyAdviceAdapter以下代码为自定义 ModifyBodyAdvice 实现 RequestBodyAdviceAdapterControllerAdvicepublicclassModifyBodyAdviceextendsRequestBodyAdviceAdapter{AutowiredHttpServletRequesthttpServletRequest;OverrideNonNullpublicObjectafterBodyRead(NonNullObjectbody,NonNullHttpInputMessageinputMessage,NonNullMethodParameterparameter,NonNullTypetargetType,NonNullClass?extendsHttpMessageConverter?converterType){StringrequestMethodhttpServletRequest.getMethod();StringfieldNamefoo;if(StringUtils.startsWithIgnoreCase(requestMethod,HttpMethod.PUT.name())||StringUtils.startsWithIgnoreCase(requestMethod,HttpMethod.POST.name())){FieldfieldReflectionUtils.findField(body.getClass(),fieldName);if(field!null){ReflectionUtils.makeAccessible(field);StringparamValueOptional.ofNullable(httpServletRequest.getHeader(fieldName)).orElse();MethodmethodReflectionUtils.findMethod(body.getClass(),setStringUtils.capitalize(fieldName),field.getType());if(method!null){ReflectionUtils.invokeMethod(method,body,paramValue);}}}returnsuper.afterBodyRead(body,inputMessage,parameter,targetType,converterType);}Overridepublicbooleansupports(NonNullMethodParametermethodParameter,NonNullTypetargetType,NonNullClass?extendsHttpMessageConverter?converterType){returntrue;}}便于演示处理过程我们在代码中写死了要修改的请求对象的属性为 foo 从请求header中获取foo这个header的值然后通过反射赋值到请求对象的foo属性。三、验证统一修改逻辑我们通过编写单元测试的方式验证RequestBody的值是否能够正常修改。在DemoApplicationTest这个单元测试程序中进行接口调用并验证返回结果。Testpublicvoidtest(){ReqBodyreqBodynewReqBody();ResponseEntityReqBodyresptestRestTemplate.exchange(RequestEntity.post(/test).header(foo,test).body(reqBody),ReqBody.class);log.info(result : {},resp);assertThat(resp.getBody().getFoo(),is(test));}我们调用controller时传入了的RequestBody为 ReqBody的一个对象这个对象没有对属性进行赋值在请求header中发送了foo这个header按照处理逻辑controller中接收到的ReqBody对象的foo的值应该是header的值。

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询