Java Spring RestController-拦截方法调用

Java Spring RestController-拦截方法调用,java,spring,aop,interceptor,Java,Spring,Aop,Interceptor,我有一个SpringRestController,端点使用JSON。它将JSON转换为对象,并验证字段(使用bean验证): @RequestMapping(method=RequestMethod.POST,consumes=“application/json”) 公共响应属性myMethod(@Valid@RequestBody MyEntity e){ ... } 我只想在转换和验证完成后拦截此方法的调用,以访问MyEntity,并可能中止执行 使用Spring拦截器,我只能在请求到达方

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

@RequestMapping(method=RequestMethod.POST,consumes=“application/json”)
公共响应属性myMethod(@Valid@RequestBody MyEntity e){
...
}
我只想在转换和验证完成后拦截此方法的调用,以访问
MyEntity
,并可能中止执行

使用Spring拦截器,我只能在请求到达方法之前拦截它——因此我没有访问经过验证的bean的权限。我可以使用SpringAOP并添加切入点,但是有没有一种方法可以很好地中止执行——理想情况下不引发异常


此功能不属于此方法的业务逻辑,是临时的,因此我想将其分离。

一个可能的解决方案是在Spring的代理对象和原始类的对象之间创建一个bean代理。为此,您需要:

  • 实现您自己的
    BeanPostProcessor
  • Spring将在实例化类的对象之后,但在包装和初始化它之前,调用它的
    postProcessBeforeInitialization()
    方法。在这个方法中,确定哪些bean必须与您的功能一起提供。这通常是通过方法或类上的自定义注释来完成的
  • 为步骤2中的bean创建自己的代理。您可以使用cglib或更现代的工具来实现这一点。您的代理将进行所有需要的检查,然后在一切正常的情况下调用父方法,或者在出现问题的情况下从方法中静默返回
  • postProcessBeforeInitialization()
    返回代理,它将指示Spring使用它而不是原始bean

  • 因此,Spring将创建代理的代理,而不是原始对象的代理。当请求到达时,Spring将进行验证并将其发送给您的代理。您的代理将进行所有自定义检查,并决定是将其进一步发送到原始类还是立即返回。

    一个可能的解决方案是在Spring的代理对象和原始类的对象之间创建一个bean代理。为此,您需要:

  • 实现您自己的
    BeanPostProcessor
  • Spring将在实例化类的对象之后,但在包装和初始化它之前,调用它的
    postProcessBeforeInitialization()
    方法。在这个方法中,确定哪些bean必须与您的功能一起提供。这通常是通过方法或类上的自定义注释来完成的
  • 为步骤2中的bean创建自己的代理。您可以使用cglib或更现代的工具来实现这一点。您的代理将进行所有需要的检查,然后在一切正常的情况下调用父方法,或者在出现问题的情况下从方法中静默返回
  • postProcessBeforeInitialization()
    返回代理,它将指示Spring使用它而不是原始bean
  • 因此,Spring将创建代理的代理,而不是原始对象的代理。当请求到达时,Spring将进行验证并将其发送给您的代理。您的代理将进行所有自定义检查,并决定是将其进一步发送到原始类还是立即返回

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