Переопределить установщик в @ConfigurationProperties с типом списка - PullRequest
1 голос
/ 31 января 2020

Я использую Spring Boot 1.5.15 , и у меня возникают проблемы при чтении компонента, помеченного аннотацией @ConfigurationProperties.

Подробно, я пытаюсь используйте следующий bean-компонент.

@ConfigurationProperties(prefix = "permissions")
public class Permissions {
    private List<String> permissions;
    private Set<String> permissionsSet;

    public List<String> getPermissions() {
        return this.permissions;
    }

    public void setPermissions(List<String> permissions) {
        this.permissionsSet = new HashSet<>(permissions)
        this.permissions = permissions;
    }

    // Other code
}

Соответствующий application.yml следующий:

permissions:
  permissions:
    - ROLE_1
    - ROLE_2

Проблема, с которой я сталкиваюсь, состоит в том, что элемент permissionsSet всегда пуст. Я отладил приложение и обнаружил, что Spring использует следующий рабочий процесс для создания bean-компонента.

  1. Вызов конструктора по умолчанию
  2. Вызов сеттера с пустым списком
  3. Инъекция правильного значения для списка после вызова установщика.

Это правильное поведение? Я пытаюсь найти ссылку в документации, но ничего не могу найти.

Есть ли способ решить эту проблему?

Большое спасибо.

1 Ответ

1 голос
/ 31 января 2020

Является ли это право спорно, как вы заметили, это то, что происходит.

Если у вас есть только небольшой набор разрешений (например, несколько), самым простым решением было бы просто получить возвращение геттера

return Sets.newHashset(permissions) 

или тому подобное. В большинстве случаев недостаток производительности не имеет значения.

Если вы боитесь проблем с производительностью, вы можете инициализировать permissionsSet как null и правильно инициализировать его при первом использовании геттера (т. Е. Инициализировать его с permissions, если он нулевой).

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...