如何获取由 .yml 文件中的值初始化的常量? (春季启动/java)

问题描述 投票:0回答:1

如果我有这样的事情:

public class Roles {
    public static final String ENVIRONMENT_DEPENDENT_ADMIN_ROLE = "ADMIN";
    private Roles() {}
}

最终在 Spring Boot 中在控制器级别使用:

@RolesAllowed(ENVIRONMENT_DEPENDENT_ADMIN_ROLE)

此注释需要一个常量,因此没有简单的方法可以绕过它。

问题是,每个角色都有不同的名称,需要根据其部署的环境来使用。

有没有办法在编译之前从相关环境application.yml中提取this的值?

示例application-dev.yml

app:
    roles:
        admin: devappadminrole

因此它在运行时最终是这样的:

public static final String ENVIRONMENT_DEPENDENT_ADMIN_ROLE = "devappadminrole";

我知道这是不好的做法,并且在很多方面都违背了 Java 编码实践,但这就是我的要求。

我尝试研究一些编译时选项,例如 Roles java 文件中的查找和替换,这看起来有点老套。我也考虑过编辑 build.gradle 脚本。

java spring-boot gradle yaml constants
1个回答
-1
投票

这是针对您的场景的解决方案,通过

yml
动态配置角色。我将使用代码片段来理清思路。

如果你有 spring aop 的经验,我认为构建它会很容易,即使没有,也没关系,下面的示例代码片段会让事情变得更容易:

@Aspect
@Component
public class RolesAllowedAspect {
    @Value("${app.roles.admin}")
    String roleConfig;  //  get Config user SpringEL

    private Environment environment; //  get Config from environment

    @Autowired
    public MyAspect(Environment environment) {
        this.environment = environment;
    }

    //1. Mark  ```@RolesAllowed``` as pointcut
    @Before("execution(@com.example.annotations.RolesAllowed * *(..)) && @annotation(rolesAllowed)")
    public void beforeAdvice() {
        String propertyValue = environment.getProperty("app.roles.admin");
       // .....2. do your code business, value comparison or others
    }

}
© www.soinside.com 2019 - 2024. All rights reserved.