Spring @Value аннотация принудительно применяет min max int

У меня есть следующее поле с пометкой @Value, указав значение по умолчанию:

@Value("${tolerance.percentage:25}")
private int tolerance;

Этот код правильно инициализирует значение поля в системном свойстве "допуск.процент", если такой объект существует. Если он не существует, по умолчанию используется значение 25.

Однако я хочу сделать еще один шаг, установив минимальное и максимальное значения в этом поле int, поскольку оно представляет процент меньше целого числа, а закон Мерфи означает, что кто-то (возможно, я) может внешне неправильно настроить свойство и мой приложение начнет делать странные вещи во время выполнения, что на мой взгляд слишком поздно. Я хотел бы выдать ошибку, если при запуске приложения для свойства установлено значение "101" или "-1". Черт, я бы даже хотел, чтобы была выдана ошибка, если я попытаюсь установить по умолчанию значение 101 в @Value аннотации, но это не важно для целей этого вопроса. Вот что я попробовал:

//@Min and @Max don't produce the intended behavior when combined with @Value
@Min(0)
@Max(100)
@Value("${tolerance.percentage:25}")
private int tolerance;

Могу ли я навязать мин и макс на int поле, которое @Value в курсе?

1 ответ

Решение

Проверка с использованием регулярных аннотаций API проверки будет работать только при определенных обстоятельствах.

  1. У вас есть реализация ('hibernate-validator') на пути к классам
  2. Класс, в котором они находятся, используется для привязки внешней конфигурации

Так что вместо использования @Value с теми, которые вы, вероятно, хотите создать класс, который содержит ожидаемые свойства и использовать связывание с @ConfigurationProperties, (и вы можете использовать @Range вместо).

@ConfigurationProperties(prefix="tolerance")
public ToleranceProperties {

    @Range(min=1, max=100)
    private int percentage = 25; 

    // Here be a getter/setter
}

Это в сочетании на @Configuration класс добавить @ EnableConfigurationProperties(ToleranceProperties.class) и вы можете использовать его в любом месте, где вам нужны свойства. (См. Свойства безопасной конфигурации в справочном руководстве.

Примечание. Вы также можете объявить его как @Component,

Другие вопросы по тегам