spring-mvc - 依赖于其他 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!! "); 取决于我的错误代码。
任何人都可以建议它哪里出错了吗?
解决方案
您的方面代码非常混乱,没有多大意义:
proceed()
正如 RG 所说,您正在尝试在致电之前检查是否有响应。改用类似EmployeeResponse response = (EmployeeResponse) proceed()
的方法,检查响应,然后决定下一步做什么。- 你已经将方法参数绑定到
name
and了empId
,不需要使用pjp.getArgs()
. return arguments
没有意义,因为您应该返回一个EmployeeResponse
对象(原始结果或另一个),而不是方法参数数组。
推荐阅读
- excel - 无法在 excel 2013 上的 citrix 上运行 Excel VBA 代码
- python - 以特定方式组合一组数组
- c - 在 Nvidia Jetson 上除以零不会导致运行时异常
- r - 是否有一个 R 函数可以从具有许多 NA 值的逗号分隔字符串中仅提取数字以创建仅包含数字的列?
- java - 如何使用泛型将类及其类型作为参数传递?
- php - 使用 eloquont 从表中删除记录
- angular - HttpParams 不请求过滤的 JSON
- c++ - 使用“-ffast-math”在 GCC 上与 quiet_NaN 进行浮点比较总是产生真(!)
- c++ - 如何使用 std::regex 获取所有捕获?
- jmeter - JMeter 当控制器命中 HTTP POST 请求 5 次时,每个 POST 需要 5 个不同的变量