2011-08-30 2 views
2

나는 Spring에 의해 생성 된 빈을 가지고있다. 실제 클래스는 Spring과 다른 JAR에있다. 이 bean은 경로를 생성자 인수로 전달됩니다. 그러나 파일 핸들을 검색하는 데 문제가 있습니다. 파일은 WEB-INF/classes /에 있습니다. WEB-INF를 기반으로 상대 경로 지정을 시도했지만 분명히 작동하지 않았습니다.속성 파일의 경로를 얻고 런타임에 빈에 전달하는 방법

XML :

<bean id="configurationManager" class="package.ConfigurationManager" 
     scope="singleton">   
     <property name="configurationMapping"> 
      <bean class="package.PropertiesFileConfigurationMapper"> 
       <constructor-arg type="java.lang.String"> 
        <value>/path/to/file</value> 
       </constructor-arg> 
      </bean> 
     </property>      
</bean> 

콩 :

나는 rm.properties 파일에 적절한 경로를 가져올 수 런타임에 빈에 전달할 수있는 방법
public class ConfigurationMapper { 

    public ConfigurationMapper(String resource) { 
      _map = new HashMap<String, String>(); 
     String property = null; 
     BufferedReader reader = null; 
     try { 
      FileReader file = new FileReader(resourcePath); 
      reader = new BufferedReader(file); 
      while ((property = reader.readLine()) != null) { 
       if (property.matches("(.+)=(.+)")) { 
        String[] temp = property.split("(.+)=(.+)"); 
        _map.put(temp[0], temp[1]); 
       } 
      } 
     } catch (Exception ex){ 
      ex.printStackTrace(); 
     } finally { 
      if (reader != null) 
       reader.close(); 
     } 
    } 

    //other methods to manipulate settings 
} 

?

편집 : 생성자 코드가 추가되었습니다.

편집 : 알겠습니다. 생성자 인수를 더 이상 경로를 변경하지 않았습니다. 이제는 Resource가 필요하므로 Spring은 내가 원했던 리소스를 발견했습니다.

+0

클래스 경로 접미사를 사용해보십시오. 나는 classpath : filpath를 의미한다. –

답변

6

java.io.FileFileReader은 실제 파일에서만 작동합니다. JAR 파일 내에 압축 된 자원 자체는 파일이 아닙니다.

그것이 클래스 패스 리소스로입니다로드하는 가장 쉬운 방법이 교체

:이 같은 뭔가

FileReader file = new FileReader(resourcePath); 
reader = new BufferedReader(file); 

: 봄의 Resource 추상화를 사용

InputStream inputStream = getClass().getResourceAsStream(); 
reader = new BufferedReader(new InputStreamReader(inputStream)); 

을 더 나은 아직, 생성자 매개 변수를 org.springframework.core.io.Resource :

0123으로 선언하여

당신이 다음 경로를 제공하는 경우 :

<constructor-arg value="classpath:/path/to/file"/> 

봄이 자동으로 (클래스 경로를 사용하여) 해당 경로에 대한 ClasspathResource을 만들고, 생성자에 전달됩니다.

+0

예. 이것은 내가 한 일이지만, 당신이 그것을 제안하기 전에 잠깐이 전략을 언급 한 기사를 발견했습니다. – tafoo85

0

봄에는 복잡한 리소스 선언이 있습니다. 파일, 클래스 패스를 선언하거나 자신의 아이디어로 확장 할 수 있습니다. 모든 것은 리소스 URI를 기반으로합니다. 파일이 jar 파일에 있기 때문에 당신은 클래스 경로를 사용하여로드 할 수 있도록 :

 <bean class="package.PropertiesFileConfigurationMapper"> 
      <constructor-arg> 
       <value>classpath:/path/to/file/in/jar</value> 
      </constructor-arg> 
     </bean> 

지금 java.io.InputStream를을 당신의 생성자를 수정합니다.

public ConfigurationMapper(InputStream resource) { 
    BufferedReader reader = new BufferedReader(new InputStreamReader(resource)); 
    .... 
} 
관련 문제