복붙노트

[SPRING] 프로퍼티 파일의 경로를 얻고이를 런타임에 Bean에 전달하는 방법

SPRING

프로퍼티 파일의 경로를 얻고이를 런타임에 Bean에 전달하는 방법

나는 봄에 의해 만들어진 콩을 가지고있다. 실제 클래스는 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> 

콩:

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
}

rm.properties 파일에 대한 적절한 경로를 얻고이를 런타임에 Bean에 전달하는 방법은 무엇입니까?

편집 : 생성자 코드를 추가했습니다.

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

해결법

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

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

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

    그것을로드하는 가장 쉬운 방법은 classpath 리소스입니다.

    이것을 대체하십시오 :

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

    이런 식으로 :

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

    더 나은 방법은 생성자 파라미터를 org.springframework.core.io.Resource로 선언하여 Spring의 Resource 추상화를 사용하는 것이다.

    public ConfigurationMapper(Resource resource) {
       ...
       InputStream inputStream = resource.getInputStream();
       reader = new BufferedReader(new InputStreamReader(inputStream));
    

    그런 다음 경로를 제공 할 때 :

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

    Spring은 클래스 경로를 사용하여 그 경로에 대한 ClasspathResource를 자동으로 생성하여 생성자에 전달합니다.

  2. ==============================

    2.Spring은 복잡한 리소스 선언을 가지고있다. 파일, 클래스 패스를 선언하거나 자신의 아이디어로 확장 할 수 있습니다. 모든 것은 리소스 URI를 기반으로합니다. 파일이 jar 파일에 있으므로 classpath를 사용하여로드 할 수 있습니다.

    Spring은 복잡한 리소스 선언을 가지고있다. 파일, 클래스 패스를 선언하거나 자신의 아이디어로 확장 할 수 있습니다. 모든 것은 리소스 URI를 기반으로합니다. 파일이 jar 파일에 있으므로 classpath를 사용하여로드 할 수 있습니다.

            <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 ) );
        ....
    }
    
  3. from https://stackoverflow.com/questions/7246369/how-to-get-the-path-to-a-properties-file-and-pass-it-to-a-bean-at-runtime by cc-by-sa and MIT license