当依赖其他REST服务的响应时,周围的Advice无法工作。

问题描述 投票:0回答:1

我正在使用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来获取上下文,但似乎它将使用当前的上下文,即 "addemployee".我如何才能从checkForPath()中返回实际状态(因为我不需要为每一个返回的状态代码调用pjp.proceedings),以便我可以根据我的错误代码执行System.out.println("Call Second path please!");这一行。

谁能告诉我这是哪里出了问题?

spring-mvc aop aspectj spring-aop
1个回答
0
投票

你的aspect代码相当混乱,没有什么意义。

  1. 你是想在调用之前先检查一下是否有响应 proceed()正如R. G所说 使用类似 EmployeeResponse response = (EmployeeResponse) proceed() 而不是检查响应,然后决定下一步该怎么做。
  2. 你已经将方法参数绑定到 nameempId,没有必要使用 pjp.getArgs().
  3. return arguments 是没有意义的,因为你应该返回一个 EmployeeResponse 对象(无论是原始结果还是另一个),而不是方法参数的数组。
© www.soinside.com 2019 - 2024. All rights reserved.