我有一个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代理。要做到这一点,你需要:
- 实现你自己的
BeanPostProcessor
Spring将在实例化类的对象之后调用它的 - 从
postProcessBeforeInitialization()
返回代理,它将指示Spring使用它而不是原始bean。
postProcessBeforeInitialization()
方法,但在包装和初始化它之前。在此方法中,确定必须为您的功能提供哪些bean。这通常是通过你在方法或类上的自定义注释来完成的。为步骤2中的bean创建您自己的代理。你可以使用cglib或者更现代的工具。你的代理将做所有你需要的检查,然后调用父的方法,如果一切正常,或者只是静静地从方法返回,如果有什么错误。