2013-05-15 6 views
0

스프링 MVC 애플리케이션이 있습니다. Tomcat 7 서버에서 실행됩니다.속성에 액세스 할 수 없습니다.

내 app이 Beans 초기화 프로세스 중에 속성에 액세스 할 수 있도록 props.properties 파일을 만들고 싶습니다.

그래서 나는 한 다음

1.Create

<context-param> 
     <param-name>mainProps</param-name> 
     <param-value>${catalina.home}/conf/props.properties</param-value> 
    </context-param> 

2.

가 나는 MainCobfig 클래스

@Configuration 
@PropertySource("classpath:/racoonsoft/wish/properties/props.properties") 
@Import({WebConfig.class }) 

public class MainConfig { 
@Autowired 
Environment env; 

@Value("${db.host}") 
static String dbHost; 
@Value("${db.name}") 
static String dbName; 
@Value("${db.login}") 
static String dbLogin; 
@Value("${db.password}") 
static String dbPassword; 

@Value("${ozon.login}") 
static String ozonLogin; 
@Value("${ozon.password}") 
static String ozonPassword; 
@Value("${ozon.apiurl}") 
static String ozonApiUrl; 

@Value("${payture.apihost}") 
static String paytureApiHost; 
@Value("${payture.merchant}") 
static String paytureMerchant; 

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

@Bean 
public ScheduledAnnotationBeanPostProcessor scheduledAnnotationBeanPostProcessor() { 
    return new ScheduledAnnotationBeanPostProcessor(); 
} 

@Bean 
public OzonProcessor apiProcessor() { 
    return new OzonProcessor(ozonLogin, ozonPassword, ozonApiUrl); 
} 

@Bean 
public PGSQLDataSource pgsqlDataSource() throws Exception{ 
    PGSQLDataSource result = new PGSQLDataSource(dbHost,dbName,5432,dbLogin,dbPassword,"org.postgresql.Driver","jdbc:postgresql:"); 
    result.loadSettings(); 
    if(FacebookController.dbProc==null) 
    { 
     FacebookController.dbProc = result; 
    } 
    //FacebookController.dbProc = result; 
    return result; 
} 
@Bean 
public PaytureProcessor paytureProcessor() 
{ 
    PaytureProcessor proc = new PaytureProcessor(paytureApiHost,paytureMerchant); 
    return proc; 
} 
} 

3를 만들어 내 web.xml 파일에 대한 컨텍스트 파라미터 - I props.properties 파일을 만들고/conf 디렉토리에 넣습니다.

내 응용 프로그램을 시작할 때 d idnt 예외 (파일을 찾을 수 없습니다) 던져 - 그래서 내가 속성 파일을 볼 수 beleave. 하지만 빈 초기화 동안 필드 (dbHost, dbLogin 등)는 여전히 null입니다.

속성 파일의 값을 내 필드에 어떻게 넣을 수 있습니까?

도와주세요.

답변

3

PropertySourcesPlaceholderConfigurer의 주석 팩토리 메소드는 정적 방법이어야한다.

조금 더 자세한 설명 : PropertySourcesPlaceholderConfigurerBeanFactoryPostProcessor (BFPP) 때문에

이다. BFPP는 다른 (정상적인) bean을 인스턴스화하고 초기화하기 바로 전에 bean factory에서 사후 처리를 수행합니다. 따라서 BFPP를 작성하려면 전에을 입력하고 MainConfig을 인스턴스화합니다. 이 팩토리 메서드를 정적 메서드로 표시하면 MainConfig을 인스턴스화하지 않고이 메서드를 호출 할 수 있습니다.

+0

변경했습니다 (문제의 코드 업데이트). 그러나 pgsqlDataSource()가 호출 될 때 null 값을가집니다 ... – user2160696

+0

'@ Value' 주석을 사용하여 주입하는 필드는 ** 정적이 아니어야합니다 **. 정적 필드는 자리 표시 자 프로세서의 대상이 아닙니다. –

-2
# form user login properties 
userName.required = User Name is required 

컨트롤러 쪽에서는 userName.required 만 선언하십시오. 그것이 당신이 선언하는 방법입니다.

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

Spring API Reference manual of @Bean 발언이 :

관련 문제