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

Spring@AliasFor不适用于@Profile注释

白昊乾
2023-03-14

环境:科特林 1.5.30, 春靴 2.5.4(Spring 5.3.9)

我试图创建一个组合注释来简化类似的模板注释代码。注释类如下:

@Profile("default")  //NOTE 1: use a placeholder, see the investigations below
annotation class ProfileAware(
    @get: AliasFor(annotation = Profile::class, attribute = "value")
    val profiles: Array<String>,
    //properties delegated for other annotations
)

预期用法:

@Component
@ProfileAware(profiles = ["dev"])
class TheBean {

    init {
        LoggerFactory.getLogger("TheBean").info("TheBean: I'm registered")
    }
}

application.yaml:

spring:
  profiles:
    active: dev

但在应用程序启动后,TheBean 未按预期注册。

>

  • 首先,我在github spring存储库中搜索,发现了这个:回归:自定义组合@Profile注释,组件扫描不再支持没有运行时保留。所以我试图在@ProfileAware上添加@Retention(注释保留.RUNTIME),但没有效果。

    尝试从元注释中删除(“默认”)值(以及是否将默认值添加到配置文件属性),但得到了 java.lang.非法描述异常:必须指定至少一个配置文件

    试图从元注释中删除@Profile(“default”),但得到注释配置异常:@AliasFor注释中属性“Profile”的声明…它不存在元

    (重要)尝试直接在豆上使用@Profile(“dev”)而不是配置文件软件 ,按预期工作。

    (重要)尝试将元注释上的值更改为“dev”,它可以工作,但显然它是硬编码的,不符合我的需要。

    我做错了什么吗?或者是否可以创建具有动态@Profile值的复合注释?

    感谢您的阅读和帮助。


  • 共有1个答案

    柏高丽
    2023-03-14

    @Profile组织查找,匹配(...)方法使用组织.Spring框架.core.type.注释类型Metadata.getAll注释属性(字符串)来查找@Profile注释,并且该方法的Javadoc声明如下(由我添加的粗体强调)。

    检索给定类型的所有注释的所有属性(如果有的话)(即,如果在底层元素上定义,作为直接注释或元注释)。请注意,该变体不考虑属性覆盖。

    因此,您目前不能将@Profile@AliasFor一起用于注释属性覆盖。

     类似资料:
    • 最近,我尝试了Spring4中新的内置CORS支持。这个特性很棒,我想在我的Spring Boot/AngularJS应用程序中实现它。 所有请求都可以正常工作,但是我不能注销我的用户,因为-request to是由Spring Security处理的。 是否可以在Spring Security之前处理-request,或者是否应该在中附加cors-header?

    • 我是Spring的新手,我很困惑@CreatedDate注释在实体中是如何工作的。 我做了一次谷歌搜索,有很多解决方案,但除了一个,没有一个适合我。我很困惑为什么? 这是我先试的 它不起作用。我为列中的值获取了NULL。 然后我做了这个。 这实际上将时间戳存储在db中。我的问题是,我遵循的大多数教程都建议我不需要来获取当前时间戳。看起来我确实需要它。我缺少什么吗?

    • 我正在开发一个示例SpringBoot应用程序。我有两个包裹。通用域名格式。A(其中有@springbootApplication注释的主类)2。通用域名格式。B(其他春豆)。 现在我的问题是:由于应用程序失败,包B中的Spring bean没有被扫描。我尝试使用a。@springbootApplication atio(scanBasePackages="com. B")b。也@组件扫描(...

    • 我试图让RunWith(PowerMockRunner.class)处理我现有的包注释。 版本: Powermock 1.4.12 mockito 1.9.0 jUnit 4.8.2 package-info.java//这是包注释 测试说明。java//这是包“com.smin.dummy”的元数据注释类 A、 爪哇 莫卡。Java语言 在unitest MockA中。如果我不使用RunWith

    • 当我在Spring Boot项目的控制器类中使用“@Validated”注释并在Liberty服务器上运行它时,依赖项注入出现中断(它在调用注入变量的行上返回NullPointerException)。如果我在Tomcat上运行这个项目,它工作得很好。如果我在类上注释掉“@Validated”并在Liberty上运行项目,也可以。它只有“@Validated”和自由。有什么想法吗? 以下是我的最小