【问题标题】:Spring Boot: How to pass context from a custom Aspect to Rest Controller ClassSpring Boot:如何将上下文从自定义 Aspect 传递到 Rest Controller 类
【发布时间】:2017-08-07 20:31:33
【问题描述】:

我已经定义了一个自定义方面,它会查找资源并进行很少的验证并快速失败。如果验证成功,我如何将资源传递给我的 Rest Controller 类以避免额外的数据库查找

【问题讨论】:

  • 最好在你的代码段中加上问题。

标签: spring-boot aspectj spring-aop spring-restcontroller thread-local


【解决方案1】:

你可以这样做:

@Aspect
@Component
public class SomeAspectClass {

    @Around("execution(* com.example.controller.yourController.yourMethod (SomeClass)) && args(someObject)")
    public Object sendDataToControllerMethod(ProceedingJoinPoint proceedingJoinPoint, SomeClass someObject) {
        //Do your validation, db related works
        // "someObject" can be filled, changed etc. here
        YourMethodReturnClass yourMethodReturnObject = (YourMethodReturnClass) proceedingJoinPoint.proceed(new Object[] {someObject});
        return yourMethodReturnObject;
    }
}

【讨论】:

  • 同意,但上述方法的问题是我需要更改我不想做的控制器方法定义。理想情况下,我需要一个球衣等效的 URIContext 或某种不会破坏现有方法签名和参数的本地线程。
  • 为什么这种方法需要改变控制器方法?
  • 我的大部分方法参数都是自定义 java 对象。我不想通过添加我想传递给控制器​​方法的额外信息来污染这些对象。
  • 怎么样:您可以使用过滤器。从 db 中获取必要的数据并将它们作为 Request Param 添加到请求中。在您的控制器方法中,您可以将它们作为请求参数,因此无需污染您的对象。
  • 我考虑过这个选项,但是当我将参数声明为请求参数时,它出现在我的招摇文档中。这对我来说很重要,因为我会将我的 API 暴露给外部客户。这就是我提到我不想更改方法签名的原因。
猜你喜欢
  • 2021-11-29
  • 2021-05-01
  • 2018-12-02
  • 2018-11-03
  • 1970-01-01
  • 1970-01-01
  • 2015-12-28
  • 2019-09-27
  • 2023-03-20
相关资源
最近更新 更多