gpt4 book ai didi

java - Spring Boot--如何使用具有正则表达式值的@Profile?

转载 作者:行者123 更新时间:2023-12-02 00:02:23 35 4
gpt4 key购买 nike

我的 springboot maven 项目中有一个类。我想用 @Profile 注释类,这样就不应该为任何以“-test”结尾的配置文件配置此类。

ConfigureData 类在/main 下。

在我的/test 目录下,我有几个用 @ActiveProfiles 注释的测试类,如“unit-test”、“integration-test”、“functional-test”、“system-test”等。

我正在尝试类似下面的方法来忽略所有以“-test”结尾的配置文件的“ConfigureData”类的自动配置,但它不起作用!

有没有一种方法可以使用一些正则表达式来实现这一点,而无需在@Profile 下指定每个测试配置文件的名称?

@Configuration
@Profile("!.*-test")
public class ConfigureData {

}

最佳答案

我不能说 SPeL 我知道它支持带有“匹配”(特殊词)的正则表达式,但是,我认为它太脆弱了,所以我建议另一种方法:使用带有自定义条件的条件。

事实上,在 Spring 3.x 中引入的 @Profile 在 spring 4 中被重写,以使用更灵活的“条件方法”实现。

看一下profile annotation的源码:

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Conditional(ProfileCondition.class)
public @interface Profile {

/**
* The set of profiles for which the annotated component should be registered.
*/
String[] value();

}

请注意,配置文件是作为“条件”实现的,它有一个自定义条件,用于检查所有当前正在运行的配置文件并决定条件是否匹配。

这是 Spring 4 中 Condition 的一个实现:

class ProfileCondition implements Condition {

@Override
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
if (context.getEnvironment() != null) {
MultiValueMap<String, Object> attrs = metadata.getAllAnnotationAttributes(Profile.class.getName());
if (attrs != null) {
for (Object value : attrs.get("value")) {
if (context.getEnvironment().acceptsProfiles(((String[]) value))) {
return true;
}
}
return false;
}
}
return true;
}

}

因此,您可以创建自己的注释,例如 @Production,使用您的自定义条件进行注释以检查配置文件,如果是测试 - 不匹配或其他内容。

然后将@Production放在配置上(问题中的class ConfigureData),你就完成了!

关于java - Spring Boot--如何使用具有正则表达式值的@Profile?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61522901/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com