首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何才能使REST控制器具有环境条件?

如何才能使REST控制器具有环境条件?
EN

Stack Overflow用户
提问于 2019-05-29 03:33:50
回答 1查看 2K关注 0票数 5

我们有一个用例,我们希望在除生产环境之外的每个环境中都启用一组端点。我们的想法是使用Spring的条件注释的变体来仅在非生产环境中启用控制器,而不是为这个用例实现自定义的安全实现。

我们最初的尝试是通过注入指定环境类型的动态系统属性来使用@ConditionalOnExpression。开发、测试、生产等)并将该属性与正则表达式进行匹配,但我们无法以适合我们需要的方式正确解析SpEL表达式。

代码语言:javascript
复制
@RestController
@ConditionalOnExpression("${property.name} matches ^((?!prod).)*$")
public class TestDataController

我们也考虑过使用@ConditionalOnProperty,但似乎没有办法允许此属性接受多个有效值。

代码语言:javascript
复制
@RestController
@ConditionalOnProperty(
        value = "property.name",
        havingValue = "value1" or "value2",
        matchIfMissing = true)
public class TestDataController

我们的最后一次尝试是编写一个自定义类,扩展Spring的条件类以满足我们的需要。目前这是可行的,但它依赖于Java文件I/O,如果可能的话,我们希望避免使用Java文件I/O。

有什么想法吗?

更新29 5月19日

我们能够使用以下解决方案来解决我们的问题:

  1. 通过以下方式定义自定义条件:

代码语言:javascript
复制
public class NotInProductionCondition implements Condition {
    @Override
    public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
        final String env = context.getEnvironment().getProperty("property.name");
        if (env == null || env.isEmpty()) {
            return true;
        }
        return !env.contains("prod");
    }
}

  1. 在我们的控制器上使用自定义条件:

代码语言:javascript
复制
@RestController
@Conditional(NotInProductionCondition.class)
public class TestDataController
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-05-29 03:41:54

您可以使用@Profile注解来实例化bean,具体取决于您环境中设置的配置文件。

代码语言:javascript
复制
@RestController
@Profile("!prod")
class MyController {
  ...
}

如果您不在环境中使用配置文件,我想您很可能会使用某种类型的环境变量来指定环境名称。你可以把它做成这样的弹簧轮廓

代码语言:javascript
复制
spring.profiles.active = ${environmentName}
票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56348966

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档