Java Spring RestController-拦截方法调用
我有一个SpringJava 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拦截器,我只能在请求到达方
RestController
,端点使用JSON。它将JSON转换为对象,并验证字段(使用bean验证):
@RequestMapping(method=RequestMethod.POST,consumes=“application/json”)
公共响应属性myMethod(@Valid@RequestBody MyEntity e){
...
}
我只想在转换和验证完成后拦截此方法的调用,以访问MyEntity
,并可能中止执行
使用Spring拦截器,我只能在请求到达方法之前拦截它——因此我没有访问经过验证的bean的权限。我可以使用SpringAOP并添加切入点,但是有没有一种方法可以很好地中止执行——理想情况下不引发异常
此功能不属于此方法的业务逻辑,是临时的,因此我想将其分离。一个可能的解决方案是在Spring的代理对象和原始类的对象之间创建一个bean代理。为此,您需要:
BeanPostProcessor
postProcessBeforeInitialization()
方法。在这个方法中,确定哪些bean必须与您的功能一起提供。这通常是通过方法或类上的自定义注释来完成的postProcessBeforeInitialization()
返回代理,它将指示Spring使用它而不是原始bean因此,Spring将创建代理的代理,而不是原始对象的代理。当请求到达时,Spring将进行验证并将其发送给您的代理。您的代理将进行所有自定义检查,并决定是将其进一步发送到原始类还是立即返回。一个可能的解决方案是在Spring的代理对象和原始类的对象之间创建一个bean代理。为此,您需要:
BeanPostProcessor
postProcessBeforeInitialization()
方法。在这个方法中,确定哪些bean必须与您的功能一起提供。这通常是通过方法或类上的自定义注释来完成的postProcessBeforeInitialization()
返回代理,它将指示Spring使用它而不是原始bean@RequestMapping(method = RequestMethod.POST, consumes = "application/json")
public ResponseEntity<?> myMethod(@Valid @RequestBody MyEntity e) {
...
}