복붙노트

[SPRING] Spring 주석을 사용하여 파일 속성 읽기

SPRING

Spring 주석을 사용하여 파일 속성 읽기

봄을 사용하여 속성 파일을 읽는 방법을 배우려고합니다. 인터넷 검색을 한 후에는 @value 및 @PropertySource 주석을 사용하여이를 달성 할 수 있음을 발견했습니다. 나는 다음과 같은 구조와 클래스 코드를 가진 프로젝트를 만들었다 :

프로젝트의 구조 :

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

봄 부르는 콩의 문제인가? 아니면 속성 파일 경로 또는 다른 문제일까요?

해결법

  1. ==============================

    1.코드에서 몇 가지 문제점을 볼 수 있습니다.

    코드에서 몇 가지 문제점을 볼 수 있습니다.

    1) 값을 저장하는 장소는 # {mongodb.url}이 아닌 $ {mongodb.url} 형식이어야합니다. "#"은 다른 의미를 갖습니다 (스프링 표현식 참조).

    2) 값 주입을 수행하려면 PropertySourcesPlaceholderConfigurer bean이 필요합니다.

    3) 조만간 콩이 떠 다니게 될 것입니다. @ComponentScan을 사용하면 컨텍스트가 이들을 하나씩 언급하지 않고도 알 수 있습니다.

    4) ComponentScan을 사용하여 빈을 가져 오는 경우 AppConfigMongoDB 빈을 한 번 제공해야합니다.

    나는이 모든 것을 한 후에 이러한 수업을 마친다.

    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;
      }
    }
    
  2. ==============================

    2.@Ian Sparkes의 멋진 회신. 내 입력 사항 중 일부를 여기에 추가합니다. PropertySourcesPlaceholderConfigurer 구성은 필수 항목이 아닙니다. 내 속성 파일에서 값을 가져올 수 있고 그것을 사용하지 않고 내 기본 Configuration 클래스의 파일 변수로 설정할 수 있습니다.

    @Ian Sparkes의 멋진 회신. 내 입력 사항 중 일부를 여기에 추가합니다. PropertySourcesPlaceholderConfigurer 구성은 필수 항목이 아닙니다. 내 속성 파일에서 값을 가져올 수 있고 그것을 사용하지 않고 내 기본 Configuration 클래스의 파일 변수로 설정할 수 있습니다.

    속성 파일에서 키 값을 가져 오는 또 다른 방법이 있습니다. org.springframework.core.env.Environment 클래스를 사용하십시오. 이 클래스는 클래스 경로에있는 속성 파일에 모든 키 - 값 쌍을 자동으로로드합니다.

    예 :

    @Configuration @ComponentScan (basePackages = "com.easy.buy") @PropertySource ({ "classpath : config.properties", "classpath : props / db - $ {env} -config.properties", "classpath : props / app - $ {env} -config.properties"}) 공용 클래스 CatalogServiceConfiguration { 로거 로거 = LoggerFactory.getLogger (CatalogServiceConfiguration.class); //이 객체는 키 쌍 ​​값으로 모든 속성을로드하고 보유합니다. @Autowired 개인 환경 env; / ** * DataSource bean 인스턴스화 및 db 연결 속성으로 초기화 * @return * / @Bean (name = "basicDataSource") 공용 BasicDataSource basicDataSource () { 문자열 dbUrl = env.getProperty ( "db.url"); 문자열 dbUser = env.getProperty ( "db.user"); 문자열 dbPwd = env.getProperty ( "db.pwd"); 문자열 드라이버 = env.getProperty ( "db.driver"); logger.info ( "CatalogServiceConfiguration 초기화"); logger.info ( "dbUrl ="+ dbUrl); BasicDataSource ds = 새 BasicDataSource (); ds.setDriverClassName (드라이버); ds.setUrl (dbUrl); ds.setUsername (dbUser); ds.setPassword (dbPwd); return ds; } }

  3. from https://stackoverflow.com/questions/28828748/read-file-properties-using-spring-annotations by cc-by-sa and MIT license