Spring RestController语言 - 拦截方法调用



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

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

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

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

此功能在此方法的业务逻辑之外,并且是临时的–所以我想把它分开

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

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

相关内容

  • 没有找到相关文章

最新更新