当前位置: 首页 > 知识库问答 >
问题:

Spring AOP和请求映射注释

薛兴德
2023-03-14

我正在创建一个类来审核对Spring Boot应用程序控制器类的调用:

@Aspect
@Component
public class ServiceAudit { //RequestMappingInterceptor {
@Pointcut("@annotation(requestMapping) && execution(* *(..))")
public void controller(RequestMapping requestMapping) {}

@Before("controller(requestMapping)")
public void advice(JoinPoint thisJoinPoint, RequestMapping requestMapping) {
    String url = requestMapping.value()[0];
    String httpMethod = requestMapping.method()[0].toString();
...
...

我的一个Controller类看起来像这样——在类AND方法级别有注释(此时我不能更改):

RestController
@CrossOrigin
@EnableConfigurationProperties
@RequestMapping(value = "/applications")
public class ApplicationController {

     ...
     ...


@RequestMapping(value = "/{id}", method = RequestMethod.GET)
public ResponseEntity<Application> findById(@PathVariable Integer id) throws Exception {

  ...
  ...
}

我可以很好地提取url、methodtype和参数。然而,我现在很难做的是拉控制器类的注释('/applications'),这样我就可以为我的审计表构建完整的URL。

我知道还有其他审计选项(比如Spring Boot Actuator),但出于各种原因,我需要在方面使用这种方法,我只是停留在这里。Spring的AnnotationUtils似乎很有帮助,但我仍停留在获取类级注释的代码上。有人这样做过吗?

更新:谢谢。那没用。你说得对——这是一个多余的部分,当我删除“执行”部分时,它起了作用,但仍然是同一个问题。本质上,问题是在这种情况下如何获得类级注释。因此,对于ApplicationController类,我如何检索在类级别定义的“/applications”路径。我想它在那里,但它嵌套在requestMapping对象中太深了,我不知道如何提取它。目前,我唯一的解决方案是为我的控制器(ApplicationController)创建一个HashMap-

共有1个答案

尉迟安民
2023-03-14

您可以像这样捕获类级注释:

@Pointcut("@target(classRequestMapping) && @annotation(requestMapping) && execution(* *(..))")
public void controller(RequestMapping classRequestMapping, RequestMapping requestMapping) {}

@Before("controller(classRequestMapping, requestMapping)")
public void advice(JoinPoint thisJoinPoint, RequestMapping classRequestMapping, RequestMapping requestMapping) {
    // do whatever you want with the value
}
 类似资料:
  • 你可以使用@RequestMapping注解来将请求URL,如/appointments等,映射到整个类上或某个特定的处理器方法上。一般来说,类级别的注解负责将一个特定(或符合某种模式)的请求路径映射到一个控制器上,同时通过方法级别的注解来细化映射,即根据特定的HTTP请求方法(“GET”“POST”方法等)、HTTP请求中是否携带特定参数等条件,将请求映射到匹配的方法上。 下面这段代码示例来自P

  • Web 容器需要本章描述的映射技术去映射客户端请求到 Servlet(该规范2.5以前的版本,使用这些映射技术是作为一个建议而不是要求,允许servlet 容器各有其不同的策略用于映射客户端请求到 servlet)。

  • 我在一个spring mvc应用程序中工作(我在spring mvc中是新的)。

  • 很抱歉再次问这种问题,但我无法通过查看其他线程和Spring doc来解决我的问题。 我正在使用maven的3.1.0.RELEASE,并尝试使用注释和java配置。 以下是我的web.xml: 这是我的档案web-application-config.xml. 我有两个类。第一个配置视图解析器 第二个定义我的控制器: 根据我的配置,我想一切都应该指向我的home()函数。然而,事实并非如此,以下

  • 我知道有很多关于映射请求数据的问题,但这两个都帮不了我。所以,我试图实现的是一个映射到lambda的APIendpoint。当bucket触发404时,将转发到该endpoint的请求,并且参数通过请求路径传递给lambda,例如:/{image_name}/{width}/{height}。lambda的代码只调用 在集成请求中,我创建了三个映射模板:plain/text、plain/html、

  • 这是我的控制器,它将请求映射到以下url