【问题标题】:Loading Spring-boot properties to POJO将 Spring-boot 属性加载到 POJO
【发布时间】:2022-02-01 02:47:42
【问题描述】:

我有这样的属性:

credentials:
   userid: <userid>
   password: <password>

我有一个 POJO:

@Setter
public class Credentials {
   private String userid;
   private String password;

但是,这个 POJO 在另一个 jar 中,所以我无法添加注释。所以我想我会尝试这样的事情:

@Configuration
@Getter
@Setter
@ConfigurationProperties("credentials")
public class MyCredentials {
   private Credentials credentials = new Credentials();
}

但我无法让我的班级加载属性。我怎样才能让它在这种情况下工作?

【问题讨论】:

  • 为什么要将凭证属性加载到凭证 POJO 中?您不需要 Credentials pojo 来访问属性文件中的值。

标签: java spring-boot spring-properties


【解决方案1】:

只需创建一个单独的配置 bean 并从该尝试下面的代码中访问值

@Configuration
@Getter
@Setter
@ConfigurationProperties("credentials")
public class MyCredentialSetting{

private String userid;
private String password;

}

现在无论您想在哪里使用,只需在控制器或服务中使用 @Autowired 即可

这里 myCredentialSetting 的值来自 spring boot 自动注入的属性文件

@Autowired
private MyCredentialSetting myCredentialSetting;

String userIdValue=myCredentialSetting.getUserid(); //you will get user id value by this
String password=myCredentialSetting.getPassword();

//Setting value to original pojo for furthur use

private Credentials credentials = new Credentials();
credentials.setUserid(userIdValue);
credentials.setPassword(password);

【讨论】:

  • 但我的意思是 POJO 已经存在于其他地方,所以我不想像您在这里使用 MyCredentialSetting 所做的那样重新创建它
【解决方案2】:

你在混合东西。

@Setter(和@Getter)很可能是 lombok 项目注解。 这些注解在编译时将在 Pojo 上生成 getX() 和 setX() 方法,属性为“x”。

如果Credentials POJO 在另一个 jar 中,它应该有一个 getter 和 setter(或者它不是 POJO)。所以我们不关心龙目岛。

另一方面,您有一个 @Configuration 类,Spring boot 将在其中创建应用程序的不同 bean。

这个类应该是这样的:

@Configuration
@ConfigurationProperties("credentials")
public class MyCredentials {

   @Bean("credentials")
   public Credentials credentials(
       @Value("${credentials.userid}") String userid,
       @Value("${credentials.password}") String password) {
         Credentials credentials = new Credentials();
         credentials.setUserid(userid);
         credentials.setPassword(password):
         return credentials;
   }

}

使用@Value 注解,Spring boot 会将属性注入到创建 bean 的方法中。

编辑我

正如@M.Deinum 所说,同样可以通过以下方式获得:

@Configuration
public class MyCredentials {

   @Bean("credentials")
   @ConfigurationProperties("credentials")
   public Credentials credentials() {
         return new Credentials();
   }
}

@ConfigurationProperties 会找到以“credentials”为前缀的属性并将它们注入到凭证 bean 中。

感谢@M.Deinum 的提示!

【讨论】:

  • 您可以将@ConfigurationProperties 放在@Bean 方法上,然后从@Bean 方法返回new Credentials()。 Spring Boot 之后会进行绑定。
  • 不混合。 Lombok 注释只是为了表明存在 Getter 和 Setter。但是您使用的是 @Value 注释。不确定将它与@ConfigurationProperties 一起使用是否有意义。 @Value 用于注入单个属性。 @ConfigurationProperties 用于注入整个结构,由前缀表示
  • @PeterKronenberg '@Getter' 和 '@Setter' 只会在 MyCredentials 类中创建一个 getCredentials() 和 setCredentials(Credentials credentials) 方法,它是一个 '@Configuration' 文件(更清晰的名称将是 MyCredentialsConf)。我编写的解决方案将创建一个设置了值的 Credentials bean。也许您想要一些不同的东西,但问题中并不清楚。
  • 课堂上不需要ConfigurationProperties
  • 复制粘贴问题:)
猜你喜欢
  • 1970-01-01
  • 2014-12-21
  • 2019-10-18
  • 1970-01-01
  • 2018-06-25
  • 2019-03-30
  • 2017-11-17
  • 1970-01-01
  • 2014-02-17
相关资源
最近更新 更多