响应结果处理器

本文介绍如何利用@ControllerAdvice和ResponseBodyAdvice在Spring MVC中全局拦截Controller方法的返回值,实现统一添加请求处理时间、链路追踪ID等信息到响应体中。

使用 @ControllerAdvice & ResponseBodyAdvice 可以拦截Controller方法默认返回参数,统一处理返回值/响应体

如:如果需要对所有ResponseDto返回类型的响应值中加入处理耗时、链路追踪reqId,可以进行如下编码

@ControllerAdvice
public class ResponseBodyHandler implements ResponseBodyAdvice {
  @Override
  public boolean supports(MethodParameter methodParameter, Class aClass) {
    // 对所有方法都支持
    return true;
  }

  @Override
  public Object beforeBodyWrite(Object o, MethodParameter methodParameter, MediaType mediaType,
      Class aClass, ServerHttpRequest serverHttpRequest, ServerHttpResponse serverHttpResponse) {
    if (!(o instanceof ResponseDto)) {
      return o;
    }
    HttpServletRequest httpRequest = ((ServletServerHttpRequest) serverHttpRequest)
        .getServletRequest();
    ResponseDto response = (ResponseDto) o;
    String reqId = (String) httpRequest.getAttribute(LogConstant.REQ_ID);
    long startTime = (long) httpRequest.getAttribute(LogConstant.REQ_START_TIME);
    long cost = System.currentTimeMillis() - startTime;
    response.setReqId(reqId);
    response.setCost(cost);
    return response;
  }

}

在 JMeter 中,若要对响应结果为 20 的情况使用后置处理器进行处理,可借助 BeanShell PostProcessor 或 JSR223 PostProcessor 来实现。以下为使用 BeanShell PostProcessor 的示例代码: ```java // 获取响应状态码 String responseCode = prev.getResponseCode(); // 获取响应内容 String response = prev.getResponseDataAsString(); // 判断响应状态码是否为 20 if (responseCode.equals("20")) { // 当响应状态码为 20 时,可在此处添加相应处理逻辑 log.info("响应状态码为 20,执行特定操作"); // 示例:设置变量 vars.put("responseIs20", "true"); } else { vars.put("responseIs20", "false"); } // 判断响应内容是否为 20 if (response.equals("20")) { log.info("响应内容为 20,执行特定操作"); // 示例:设置变量 vars.put("responseContentIs20", "true"); } else { vars.put("responseContentIs20", "false"); } ``` 若使用 JSR223 PostProcessor,选择 Groovy 语言,代码如下: ```groovy // 获取响应状态码 def responseCode = prev.getResponseCode() // 获取响应内容 def response = prev.getResponseDataAsString() // 判断响应状态码是否为 20 if (responseCode == "20") { // 当响应状态码为 20 时,可在此处添加相应处理逻辑 log.info("响应状态码为 20,执行特定操作") // 示例:设置变量 vars.put("responseIs20", "true") } else { vars.put("responseIs20", "false") } // 判断响应内容是否为 20 if (response == "20") { log.info("响应内容为 20,执行特定操作") // 示例:设置变量 vars.put("responseContentIs20", "true") } else { vars.put("responseContentIs20", "false") } ``` 在测试计划里添加后置处理器的操作如下:在测试计划中选取一个已执行过的请求,右键单击该请求,选择“添加” -> “后置处理器”,然后选择 BeanShell PostProcessor 或者 JSR223 PostProcessor,将上述代码复制到相应的脚本编辑区域即可 [^1]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值