首页 > 解决方案 > Java Spring:如何将注释封装在另一个注释中?

问题描述

是否可以将注释封装在具有值的其他注释中?

我有很多端点,API并希望自动完成roles / permissions端点访问所需的操作。

这是当前代码:

@RestController
@RequestMapping("/health")
public class HealthController {
    @GetMapping("/isAlive")
    @PreAuthorize("hasAnyAuthority('ISALIVE', 'HEALTH_ENDPOINT')")
    public String isAlive() {
        return "Server is up and running";
    }

    @GetMapping("/hello")
    @PreAuthorize("hasAnyAuthority('HELLO', 'HEALTH_ENDPOINT')")
    public String hello() {
        return "Hello";
    }
}

我有2每个端点的权限,第一个是映射和方法的名称,第二个是类的名称。

在这个例子中,只有2不同的端点使得它变得容易,但成品将有数百个,并且手工完成所有权限将容易出错并且效率不高。

这是期望的结果:

@RestController
@RequestMapping("/health")
public class HealthController {
    @GetMapping("/isAlive")
    @MyAuthorisationAnnotation
    public String isAlive() {
        return "Server is up and running";
    }

    @GetMapping("/hello")
    @MyAuthorisationAnnotation
    public String hello() {
        return "Hello";
    }
}

哪里@MyAuthorisationAnnotation会给@PreAuthorize注释提供正确的参数。

可能吗?

标签: javaspringautomationannotationsauthorization

解决方案


是否可以将注释封装在具有值的其他注释中?

一个注解可以有另一个注解作为成员。

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;

@Retention(RetentionPolicy.RUNTIME)
public @interface MyAuthorizationAnnotation {
   PreAuthorize value() default @PreAuthorize("hasAnyAuthority('HELLO', 'HEALTH_ENDPOINT')"); 
}

但是我认为这没有帮助。我不熟悉 Spring,但我认为这篇文章解决了您的问题,因为它似乎@PreAuthorize可以应用于注释,因此如果您在方法中使用检查的注释,则可以利用传递性。

解决方案的帖子


推荐阅读