我有一个Spring RestController
,其端点使用JSON。它将JSON转换为对象,并验证字段(使用bean验证):
@RequestMapping(method = RequestMethod.POST, consumes = "application/json")
public ResponseEntity<?> myMethod(@Valid @RequestBody MyEntity e) {
...
}
我想在转换和验证发生后才能拦截这个方法的调用,以便能够访问MyEntity
并可能中止执行。
使用Spring拦截器,我只能在它到达方法之前拦截请求 - 所以我无法访问经过验证的bean。我可以使用Spring AOP并添加切入点,但有没有一种方法可以很好地中止执行 - 理想情况下不会抛出异常?
此功能超出了此方法的业务逻辑,并且是暂时的 - 因此我想将其分开。
答案 0 :(得分:0)
一种可能的解决方案是在Spring的代理对象和原始类的对象之间创建一个bean代理。要做到这一点,你需要:
BeanPostProcessor
。postProcessBeforeInitialization()
方法,但在包装和初始化之前。在此方法中,确定必须为您的功能提供哪些bean。它通常通过方法或类的自定义注释来完成。postProcessBeforeInitialization()
返回代理,它将指示Spring使用它代替原始bean。结果,Spring将创建代理的代理,而不是原始对象的代理。当请求到达时,Spring将进行验证并将其发送给您的代理。您的代理人将进行所有自定义检查,并决定是将其进一步发送到原始班级还是立即返回。