首页 > 解决方案 > 依赖于其他 REST 服务的响应时,周围的建议不起作用

问题描述

我正在使用 Spring AOP 来定义一个通用的回退方法,而不是复制代码。我使用了@Around,因为我必须从 Aspect 返回对象。我试图根据返回的响应来决定 @Around 建议,但无法这样做。这是我的控制器:

@RequestMapping(value = "/add/employee", method = RequestMethod.GET)
    public EmployeeResponse addEmployee(@RequestParam("name") String name, @RequestParam("empId") String empId) {
        EmployeeResponse employeeResponse=employeeService.createEmployee(name, empId);
        return employeeResponse;

    }

服务类中的 createEmployee 用于调用另一个端点以插入一些数据。我想根据employeeResponse 决定我的建议,但无法这样做。我也尝试了@AfterReturning,但如果我使用它,我将无法返回该对象。

下面是我的方面类:

@Around(value = "execution(* com.test.service.EmployeeService.*(..)) and args(name,empId)")
public Object getAllAdvice2(ProceedingJoinPoint pjp, String name,String empId) throws Throwable {
    System.out.println("Inside Aspect");
     Object[] arguments = pjp.getArgs();
    if (!checkForPath()) {
        return pjp.proceed();
    }
    System.out.println("Call Second path please!!");
    return arguments;
    }

    private boolean checkForPath() {
        HttpServletResponse response = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes())
        .getResponse();
        return response.getStatus()==501?true:false;
    }
}

我确实使用 HttpServletResponse 和 RequestContextHolder 来获取上下文,但似乎它将采用当前上下文,即“/add/employee”。如何从 checkForPath () 返回实际状态(因为我不需要为返回的每个状态代码调用 pjp.proceed),以便我可以执行 System.out.println("Call Second path please!! "); 取决于我的错误代码。

任何人都可以建议它哪里出错了吗?

标签: spring-mvcaopaspectjspring-aop

解决方案


您的方面代码非常混乱,没有多大意义:

  1. proceed()正如 RG 所说,您正在尝试在致电之前检查是否有响应。改用类似EmployeeResponse response = (EmployeeResponse) proceed()的方法,检查响应,然后决定下一步做什么。
  2. 你已经将方法参数绑定到nameand了empId,不需要使用pjp.getArgs().
  3. return arguments没有意义,因为您应该返回一个EmployeeResponse对象(原始结果或另一个),而不是方法参数数组。

推荐阅读