У нас есть сценарий использования, в котором мы хотим, чтобы набор конечных точек был включен в любой среде, кроме рабочей среды. Вместо того чтобы реализовывать пользовательскую реализацию безопасности для этого варианта использования, наша идея заключалась в том, чтобы использовать вариант условной аннотации 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
Мы смогли использовать следующее решение для решения нашей проблемы:
- Определить пользовательское условие следующим образом:
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");
}
}
- Используйте пользовательское условие на нашем контроллере:
@RestController
@Conditional(NotInProductionCondition.class)
public class TestDataController