Как я могу сделать REST-контроллер условным для среды? - PullRequest
2 голосов
/ 28 мая 2019

У нас есть сценарий использования, в котором мы хотим, чтобы набор конечных точек был включен в любой среде, кроме рабочей среды. Вместо того чтобы реализовывать пользовательскую реализацию безопасности для этого варианта использования, наша идея заключалась в том, чтобы использовать вариант условной аннотации Spring, чтобы включить контроллер только в непроизводственной среде.

Нашей первоначальной попыткой было использование @ConditionalOnExpression путем внедрения динамического системного свойства, которое указывает тип среды (например, dev, test, prod и т. Д.) И для сопоставления этого свойства с регулярным выражением, но мы не были возможность получать выражения SpEL для правильного разрешения в соответствии с нашими потребностями.

@RestController
@ConditionalOnExpression("${property.name} matches ^((?!prod).)*$")
public class TestDataController

Мы также рассмотрели возможность использования @ConditionalOnProperty, но, похоже, нет способа разрешить этому свойству принимать несколько допустимых значений.

@RestController
@ConditionalOnProperty(
        value = "property.name",
        havingValue = "value1" or "value2",
        matchIfMissing = true)
public class TestDataController

Нашей последней попыткой было написать собственный класс, расширяющий класс Conditional в Spring для удовлетворения наших потребностей. Пока это работает, но это зависит от ввода-вывода файлов Java, которого мы хотели бы избежать, если это возможно.

Есть идеи?

ОБНОВЛЕНИЕ 29 мая 19

Мы смогли использовать следующее решение для решения нашей проблемы:

  1. Определить пользовательское условие следующим образом:
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. Используйте пользовательское условие на нашем контроллере:
@RestController
@Conditional(NotInProductionCondition.class)
public class TestDataController

1 Ответ

5 голосов
/ 28 мая 2019

Вы можете использовать аннотацию @Profile для создания экземпляра bean-компонента в зависимости от профиля, установленного в вашей среде.

@RestController
@Profile("!prod")
class MyController {
  ...
}

Если вы не используете профили в своей среде, скорее всего, вы используете переменную среды какого-либо типачтобы указать имя среды, я полагаю.Вы можете сделать его пружинным профилем, как этот

spring.profiles.active = ${environmentName}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...