Автоматическая настройка Spring пытается установить некоторые значения компонента из application.properties, в то время как я просто хочу использовать эту информацию где-то еще?

#spring-boot

#пружинный ботинок

Вопрос:

Итак, я использую keycloak для своего приложения, и у меня есть некоторые значения, application.properties подобные:

 keycloak.auth-server-url            = http://10.10.10.10:1010/auth
keycloak.resource                   = test-client
keycloak.credentials.secret         = <very-big-secret>
keycloak.realm                      = test-realm
 

Spring настраивает соединение keycloak, используя эти данные, но я также использую их в своем коде, поэтому у меня есть такая конфигурация:

 @Data
@Configuration
@ConfigurationProperties(prefix = "keycloak")
public class KeycloakConfig {
    private String authServerUrl;
    private String realm;
    private String resource;
    private Credentials credentials;
}
 

У меня есть пользователь-администратор в keycloak, и я хочу, чтобы его учетные данные были указаны в application.properties следующим образом:

 keycloak.admin.username=admin.admin 
keycloak.admin.password=changeit
 

Итак, я попытался изменить свой класс конфигурации на этот:

 @Data
@Configuration
@ConfigurationProperties(prefix = "keycloak")
public class KeycloakConfig {
    private String authServerUrl;
    private String realm;
    private String resource;
    private Credentials credentials;
    private Admin admin;
}

@Data
public class Admin {
    private String username;
    private String password;
}
 

Но когда я пытаюсь запустить приложение таким образом, я думаю, что spring пытается установить значения для keycloak (часть .admin), и оно не запускается:

 ***************************
APPLICATION FAILED TO START
***************************

Description:

Binding to target [Bindable@1cd5e41 type = org.keycloak.adapters.springboot.KeycloakSpringBootProperties, value = 'provided', annotations = array<Annotation>[@org.springframework.boot.context.properties.ConfigurationProperties(ignoreInvalidFields=false, ignoreUnknownFields=false, prefix=keycloak, value=keycloak)]] failed:

    Property: keycloak.admin.password
    Value: changeit
    Origin: "keycloak.admin.password" from property source "applicationConfig: [classpath:/application.properties]"
    Reason: The elements [keycloak.admin.password,keycloak.admin.username] were left unbound.
    Property: keycloak.admin.username
    Value: admin.admin
    Origin: "keycloak.admin.username" from property source "applicationConfig: [classpath:/application.properties]"
    Reason: The elements [keycloak.admin.password,keycloak.admin.username] were left unbound.

Action:

Update your application's configuration
 

Возможно ли, чтобы .admin часть keycloak была включена, или мне нужно создать новый класс, например:

 @Data
@Configuration
@ConfigurationProperties(prefix = "my-keycloak")
public class MyKeycloakConfig {
    private Admin admin;
}
 

И:

 my-keycloak.admin.username=admin.admin 
my-keycloak.admin.password=changeit
 

Ответ №1:

Я не знаком с KeyCloak, но вы можете ввести компонент, инициализированный KeyCloak, который считывает свойства.

Ответ №2:

Keycloak считывает значения из свойств приложения, используя KeycloakSpringBootProperties. Похоже, что таких значений, как имя пользователя или пароль, нет. Вероятно, Keycloak не требует, чтобы эти значения работали должным образом.

Итак, вам нужно указать свойства отдельно от keycloak.

Ответ №3:

  1. Нет, вы не можете настроить keycloak.* «домен» в свойствах spring-boot (загруженных)! Доказательство: KeycloakSpringBootProperties, в котором говорится:
     @ConfigurationProperties(prefix = "keycloak", ignoreUnknownFields = false)
     

  1. Так что это определенно второй подход!
    Определяя (в application.properties):

     my-keycloak.admin.username=admin.admin 
    my-keycloak.admin.password=changeit
     

    a)… Вы можете просто выбрать:

     @Value("${my-keycloak.admin.xxx}")
    private String myKeacloakXXX;
     

    б) Или как описано в свойствах конфигурации Typesafe (и реализовано [1] для prefix="keycloak" ):

    • Вам (просто) нужно ввести «pojo», например (изображающий структуру ваших свойств (безопасный тип)):
       @ConfigurationProperties("my-keycloak.admin") 
      public class MyKeykloakProperties {
        private String username, password; // getter, setter/lombok
      }
       

      У вас может быть также больше структуры с "my-keykloak" (префикс и вложенные классы / свойства, см. exmaple / doc)

    • Чтобы включить их:
       @Configuration
      // Or:
      @EnableConfigurationProperties(MyKeykloakProperties.class)
      
      // OR:
      //@ConfigurationPropertiesScan({ "com.example.app", "com.example.another" }) 
      public class MyKeycloakConfig { ...
       

      см. Также Включение.

    • Затем вы можете «подключить» их по своему усмотрению (также в приведенном выше классе конфигурации):
       @Autowired
      private MyKeykloakProperties properties;
       

    В качестве справки о принятии решения, пожалуйста, обратитесь к: @Value vs type safe .

Приветствия