Spring RestController - 拦截方法调用

时间:2016-08-11 14:13:33

标签: java spring aop interceptor

我有一个Spring RestController,其端点使用JSON。它将JSON转换为对象,并验证字段(使用bean验证):

@RequestMapping(method = RequestMethod.POST, consumes = "application/json")
public ResponseEntity<?> myMethod(@Valid @RequestBody MyEntity e) {
   ...
}

我想在转换和验证发生后才能拦截这个方法的调用,以便能够访问MyEntity并可能中止执行。

使用Spring拦截器,我只能在它到达方法之前拦截请求 - 所以我无法访问经过验证的bean。我可以使用Spring AOP并添加切入点,但有没有一种方法可以很好地中止执行 - 理想情况下不会抛出异常?

此功能超出了此方法的业务逻辑,并且是暂时的 - 因此我想将其分开。

1 个答案:

答案 0 :(得分:0)

一种可能的解决方案是在Spring的代理对象和原始类的对象之间创建一个bean代理。要做到这一点,你需要:

  1. 实施您自己的BeanPostProcessor
  2. Spring会在实例化类的对象之后调用它的postProcessBeforeInitialization()方法,但在包装和初始化之前。在此方法中,确定必须为您的功能提供哪些bean。它通常通过方法或类的自定义注释来完成。
  3. 为步骤2中的bean创建自己的代理。您可以使用cglib或更现代的东西。您的代理将进行您需要的所有检查,然后如果一切正常则调用父方法,或者如果出现问题则默默地从方法返回。
  4. postProcessBeforeInitialization()返回代理,它将指示Spring使用它代替原始bean。
  5. 结果,Spring将创建代理的代理,而不是原始对象的代理。当请求到达时,Spring将进行验证并将其发送给您的代理。您的代理人将进行所有自定义检查,并决定是将其进一步发送到原始班级还是立即返回。