我正在使用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!");这一行。
谁能告诉我这是哪里出了问题?
你的aspect代码相当混乱,没有什么意义。
proceed()
正如R. G所说 使用类似 EmployeeResponse response = (EmployeeResponse) proceed()
而不是检查响应,然后决定下一步该怎么做。name
和 empId
,没有必要使用 pjp.getArgs()
.return arguments
是没有意义的,因为你应该返回一个 EmployeeResponse
对象(无论是原始结果还是另一个),而不是方法参数的数组。