web-dev-qa-db-ja.com

Springアノテーションを使用してファイルプロパティを読み取る

私は、春を使用してプロパティファイルを読み取る方法を学習しようとしています。インターネットで検索した後、@valueおよび@PropertySourceそれを達成するための注釈。次の構造とクラスコードを持つプロジェクトを作成しました。

プロジェクトの構造:

enter image description here

AppConfigMongoDB.Java実装:

package com.mongodb.properties;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.PropertySource;


@PropertySource("classpath:config/config.properties")
public class AppConfigMongoDB {

@Value("#{mongodb.url}")
private String mongodbUrl;


@Value("#{mongodb.db}")
private String defaultDb;

public String getMongoDb()
{
    return defaultDb;
}

public String getMongoDbUrl()
{
    return mongodbUrl;
}
}

SpringConfiguration.Java実装:

 package com.mongodb.properties;

 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;

 @Configuration
 public class SpringConfiguration {
 @Bean
 public AppConfigMongoDB getAppConfigMongoDB(){
        return new AppConfigMongoDB();
  }
 }

Main.Java

package com.mongodb.properties;

import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class Main {

public static void main(String[] args) {
    ApplicationContext applicationContext = new AnnotationConfigApplicationContext(SpringConfiguration.class);
    AppConfigMongoDB mongo = applicationContext.getBean(AppConfigMongoDB.class);
    System.out.println("db= "+mongo.getMongoDb());
    System.out.println("URL= "+mongo.getMongoDbUrl());
  }
}

Config.propertiesという名前の読み取り元のプロパティファイルには、次の行が含まれています。

mongodb.url=1.2.3.4
mongodb.db=dataBase

この小さなプロジェクトをテストしたところ、次の例外を含むスタックトレースを取得しました。

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'getAppConfigMongoDB': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private Java.lang.String com.mongodb.properties.AppConfigMongoDB.mongodbUrl; nested exception is org.springframework.beans.factory.BeanExpressionException: Expression parsing failed; nested exception is org.springframework.expression.spel.SpelEvaluationException: EL1008E:(pos 0): Property or field 'mongodb' cannot be found on object of type 'org.springframework.beans.factory.config.BeanExpressionContext' - maybe not public?
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.Java:334)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.Java:1202)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.Java:537)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.Java:476)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.Java:303)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.Java:230)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.Java:299)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.Java:194)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.Java:755)
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.Java:757)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.Java:480)
at org.springframework.context.annotation.AnnotationConfigApplicationContext.<init>(AnnotationConfigApplicationContext.Java:84)
at com.mongodb.properties.Main.main(Main.Java:9)

 Caused by: org.springframework.expression.spel.SpelEvaluationException: EL1008E:(pos 0): Property or field 'mongodb' cannot be found on object of type 'org.springframework.beans.factory.config.BeanExpressionContext' - maybe not public?
at org.springframework.expression.spel.ast.PropertyOrFieldReference.readProperty(PropertyOrFieldReference.Java:226)
at org.springframework.expression.spel.ast.PropertyOrFieldReference.getValueInternal(PropertyOrFieldReference.Java:93)
at org.springframework.expression.spel.ast.PropertyOrFieldReference.getValueInternal(PropertyOrFieldReference.Java:81)
at org.springframework.expression.spel.ast.CompoundExpression.getValueRef(CompoundExpression.Java:51)
at org.springframework.expression.spel.ast.CompoundExpression.getValueInternal(CompoundExpression.Java:87)
at org.springframework.expression.spel.ast.SpelNodeImpl.getValue(SpelNodeImpl.Java:120)
at org.springframework.expression.spel.standard.SpelExpression.getValue(SpelExpression.Java:242)
at org.springframework.context.expression.StandardBeanExpressionResolver.evaluate(StandardBeanExpressionResolver.Java:161)
... 18 more

SpringがBeanを呼び出す問題ですか?または、プロパティファイルのパスなどの問題でしょうか。

10
Kallel Omar

コードにはいくつかの問題があります。

1)値のプレースホルダーは、${mogodb.url}ではなく、#{mongodb.url}という形式にする必要があります。 「#」の意味は異なります( Spring Expressions を参照)。

2)値の注入を行うにはPropertySourcesPlaceholderConfigurer Beanが必要になります

3)遅かれ早かれ、たくさんのBeanが浮かんでくるでしょう。私は@ComponentScanを使用して、1つずつ言及せずにコンテキストがこれらを知ることができるようにします

4)ComponentScanを使用してBeanを取得する場合、AppConfigMongoDB Beanを1回提供する必要があります。

これらすべてを行った後、これらのクラスになります。

Main.Java

import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class Main {

public static void main(String[] args) {
    ApplicationContext applicationContext = new AnnotationConfigApplicationContext(SpringConfiguration.class);
    AppConfigMongoDB mongo = applicationContext.getBean(AppConfigMongoDB.class);
    System.out.println("db= "+mongo.getMongoDb());
    System.out.println("URL= "+mongo.getMongoDbUrl());
  }
}

SpringConfiguration.Java

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.support.PropertySourcesPlaceholderConfigurer;

@Configuration
@ComponentScan
public class SpringConfiguration {

  @Bean
  public static PropertySourcesPlaceholderConfigurer propertyConfigInDev() {
    return new PropertySourcesPlaceholderConfigurer();
  }
}

AppConfigMongoDB.Java

import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;

@Configuration
@PropertySource("classpath:config/config.properties")
public class AppConfigMongoDB {

  @Value("${mongodb.url}")
  private String mongodbUrl;

  @Value("${mongodb.db}")
  private String defaultDb;

  public String getMongoDb() {
    return defaultDb;
  }

  public String getMongoDbUrl() {
    return mongodbUrl;
  }
}
24
ISparkes

@Ian Sparkesからの素敵な返信。ここにいくつかの入力を追加します。 PropertySourcesPlaceholderConfigurerの構成は必須ではありません。プロパティファイルから値を取得し、それなしでメインのConfigurationクラスのフィールド変数に値を設定できます。

プロパティファイルでキーの値を取得する別の方法もあります。 org.springframework.core.env.Environment classを使用します。このクラスは、クラスパスにあるプロパティファイルのすべてのキーと値のペアを自動的にロードします。

例:

@Configuration
@ComponentScan(basePackages="com.easy.buy")
@PropertySource({"classpath:config.properties","classpath:props/db-${env}-config.properties", 
        "classpath:props/app-${env}-config.properties"})
public class CatalogServiceConfiguration {
        Logger logger = LoggerFactory.getLogger(CatalogServiceConfiguration.class);
        
        //This object loads & holds all the properties in it as key-pair values
        @Autowired
        private Environment env;
        
        /**
         * Instantiate the DataSource bean & initialize it with db connection properties
         * @return
         */
        @Bean(name="basicDataSource")
        public BasicDataSource basicDataSource() {
                String dbUrl = env.getProperty("db.url");
                String dbUser = env.getProperty("db.user");
                String dbPwd = env.getProperty("db.pwd");
                String driver = env.getProperty("db.driver");
                
                logger.info("Initializing CatalogServiceConfiguration");
                logger.info("dbUrl=" + dbUrl);
                
                BasicDataSource ds = new BasicDataSource();
                ds.setDriverClassName(driver);
                ds.setUrl(dbUrl);
                ds.setUsername(dbUser);
                ds.setPassword(dbPwd);
                
                return ds;
        }
}
0
Ayaskant