Spring自动配置试图从application.properties设置一些bean值,而我只是想在其他地方使用这些信息?

w8f9ii69  于 2023-08-04  发布在  Spring
关注(0)|答案(3)|浏览(94)

所以我在我的应用程序中使用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

piwo6bdm

piwo6bdm1#

我不熟悉KeyCloak,但是你可以注入由读取属性的KeyCloak初始化的bean。

h22fl7wq

h22fl7wq2#

1.不可以,您不能在spring-boot(loaded)属性中自定义keycloak.*“domain”!证明:KeycloakSpringBootProperties,它说:

@ConfigurationProperties(prefix = "keycloak", ignoreUnknownFields = false)

字符串

  • 所以这绝对是第二种方法!通过定义(在www.example.com中application.properties):
my-keycloak.admin.username=admin.admin 
my-keycloak.admin.password=changeit


a)...你可以只去:

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


B)或者如Typesafe Configuration Properties所述(并由[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 { ...


请参见启用。

  • 然后你可以根据自己的需要“连接”它们(也在上面的config类中):
@Autowired
private MyKeykloakProperties properties;


作为决策帮助,请参考:@Value与类型安全。
干杯

ymdaylpp

ymdaylpp3#

Keycloak使用KeycloakSpringBootProperties从应用程序属性读取值。似乎没有用户名或密码这样的值。可能Keycloak不需要这些值才能正常工作。
因此,您需要从Keycloak单独指定属性。

相关问题