【问题标题】:Using application.properties in @Configuration class, @Bean method now working在 @Configuration 类中使用 application.properties,@Bean 方法现在可以工作
【发布时间】:2020-01-16 22:11:37
【问题描述】:

我在 java springboot 中有以下配置类定义。但是,它无法引用属性值。

@org.springframework.context.annotation.Configuration
public class HbaseConfig {

@Value("${keytab.user.name}")
private String username;

@Value("${keytab.path}")
private String keytabpath;

@Bean
public Connection getHbaseConnect() throws IOException {
    Configuration conf = HBaseConfiguration.create();
    Connection connection = ConnectionFactory.createConnection(conf); 
    UserGroupInformation.setConfiguration(conf);

    System.out.println("hbase connect..is connection closed..." + connection.isClosed());
    UserGroupInformation.loginUserFromKeytabAndReturnUGI(username, keytabpath);
    return connection;
}

@Bean
public Admin getHbaseAdmin(Connection connection) throws IOException{
    Admin admin = connection.getAdmin();
    return admin;
}

}

application.properties

 keytab.user.name="username"
 keytab.path="pathtokeytab"

简单地说,我需要从我的 HbaseConfig 类中的属性文件中读取上述 keytab 用户名和路径。

【问题讨论】:

  • 错误是什么?你得到空指针异常了吗?
  • 你有没有使用属性名作为application.property
  • 显示你的属性文件代码
  • @Jonathan Johx,是的空指针异常。我可以猜到问题是在查找值之前首先实例化 bean 的 Bean 中引用的值?。
  • @Siva 将 application.properties 重命名为 bootstrap.properties 这应该可以工作。

标签: java spring spring-boot


【解决方案1】:

你能不能试试下面的方法,

  @ConfigurationProperties(prefix = "keytab")
  public class KeyTabConfig {

        private String username;

        private String path;

        public String getUsername(){ return this.username; }
        public String getPath(){ return this.path;}
        }

Habseconfig 类如下

@Configuration
@EnableConfigurationProperties({ KeyTabConfig.class})
public class HbaseConfig {

              @Bean
              public Connection getHbaseConnect(KeyTabConfig keyTabConfig) throws IOException {
                   Configuration conf = HBaseConfiguration.create();
                   Connection connection = 
                   ConnectionFactory.createConnection(conf); 
                   UserGroupInformation.setConfiguration(conf);

                   System.out.println("hbase connect..is connection closed..." + 
                   connection.isClosed());
                   UserGroupInformation.loginUserFromKeytabAndReturnUGI(keyTabConfig.getUsername(), keyTabConfig.getPath());
                   return connection;
                 }

             @Bean
             public Admin getHbaseAdmin(Connection connection) throws IOException{
               Admin admin = connection.getAdmin();
               return admin;
              }

          }

application.properties 文件为

    keytab.username=uname
    keytab.path=path

【讨论】:

  • 我试过了,但仍然将值设为空。我假设下面的代码引用了 keytabconfig 类的对象:UserGroupInformation.loginUserFromKeytabAndReturnUGI(keyTabConfig.getUsername(), keyTabConfig.getPath()); 因此我在 HbaseConfig 类中创建了 KeyTabConfig 类的自动装配对象。
  • @Siva 即使您没有自动连接,DI 也可以在这种情况下工作。 KeyTabConfig 将根据需要注入
  • 谢谢@MidhunMohan。不过我试过了,它是空的。
  • gitlab.com/midhunmohan/environment-read-demo上述示例,您可以在此处找到它@Siva
【解决方案2】:
  1. 确保您的属性文件名应为application.properties,位置应在

src/main/resources/application.properties

  1. 仅在类级别使用@Configuration,并且还使用@PropertySource 来定义我们的属性文件的位置。@PropertySource("classpath:configprops.properties") 如果您的属性文件名不同。

否则,Spring 使用默认位置(classpath:application.properties).

【讨论】:

  • @MangduYogil 是的,属性文件名是 application.properties 并且在你提到的目录中。
  • 然后尝试使用@PropertySource("classpath:application.properties")
  • 我正在从同一个 application.properties 中读取其他属性值,但它是在我的 Repository 类中读取的,并且工作正常。
【解决方案3】:

@Value 注解的实际处理是由 BeanPostProcessor 执行的,因此我们不能在 BeanPostProcessor 类型中使用 @Value。

示例:https://www.concretepage.com/spring-5/spring-value#placeholder

链接:How exactly does the Spring BeanPostProcessor work?

【讨论】:

  • 我对这个答案投了反对票,因为您混淆了主要问题,让他添加更多细节以便您正确回答。
猜你喜欢
  • 1970-01-01
  • 2017-03-08
  • 2018-02-15
  • 1970-01-01
  • 1970-01-01
  • 2014-12-31
  • 1970-01-01
  • 1970-01-01
  • 2020-10-28
相关资源
最近更新 更多