gpt4 book ai didi

java - Spring RestController - 拦截方法调用

转载 作者:太空宇宙 更新时间:2023-11-04 12:20:29 26 4
gpt4 key购买 nike

我有一个 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。这通常是通过方法或类上的自定义注释来完成的。
  3. 为步骤 2 中的 Bean 创建您自己的代理。您可以使用 cglib 或更现代的东西来实现。您的代理将进行您需要的所有检查,然后在一切正常的情况下调用父级的方法,或者在出现问题时从该方法中默默返回。
  4. postProcessBeforeInitialization() 返回您的代理,它将指示 Spring 使用它而不是原始 bean。

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

关于java - Spring RestController - 拦截方法调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38898831/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com