복붙노트

[SPRING] PropertyPlaceholderConfigurer : 외부 속성 파일 사용

SPRING

PropertyPlaceholderConfigurer : 외부 속성 파일 사용

PropertyPlaceholderConfigurer를 설정하여 전쟁과 관련된 속성 파일 (일부 디렉토리까지)을 사용하는 방법은 무엇입니까?

우리는 전쟁을 여러 번 실행했으며 각 전쟁은 예를 들어 ../../etc/db.properties에서 구성을 읽어야합니다.

최신 정보:

예, 속성 파일은 전쟁의 범위 밖에 있습니다. 디렉토리 구조는 다음과 같습니다.

/htdocs/shop/live/apache-tomcat/webapps/shop.war 읽어야합니다 /htdocs/shop/love/etc/db.properties

/htdocs/shop/test/apache-tomcat/webapps/shop.war 읽어야합니다 /htdocs/shop/test/etc/db.properties

해결법

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

    1.마지막으로 새로운 자원 유형 "relative :"를 도입했습니다.

    마지막으로 새로운 자원 유형 "relative :"를 도입했습니다.

    <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="ignoreResourceNotFound" value="true" />
        <property name="locations">
            <list>
                <value>classpath:db.properties</value>
                <value>relative:../../../etc/db.properties</value>
            </list>
        </property>
    </bean>
    

    사용자 지정 리소스 처리를 주입하기 위해 XmlWebApplicationContext를 확장했습니다.

    public class Context extends XmlWebApplicationContext {
        @Override
        public Resource getResource(String location) {
            if (location.startsWith(RelativeResource.RELATIVE_URL_PREFIX)) {
                String relativePath = location.substring(RelativeResource.RELATIVE_URL_PREFIX.length());
                return new RelativeResource(getServletContext(), relativePath);
            }
            return super.getResource(location);
        }
    }
    

    다음은 상대 자원 클래스입니다.

    public class RelativeResource extends AbstractResource {
        public static final String RELATIVE_URL_PREFIX = "relative:";
    
        private final ServletContext servletContext;
        private final String relativePath;
    
        public RelativeResource(ServletContext servletContext, String relativePath) {
            this.servletContext = servletContext;
            this.relativePath = relativePath;
        }
    
        @Override
        public String getDescription() {
            return "RelativeResource [" + relativePath + "]";
        }
    
        @Override
        public boolean isReadable() {
            return true;
        }
    
        @Override
        public boolean isOpen() {
            return true;
        }
    
        @Override
        public InputStream getInputStream() throws IOException {
            String rootPath = WebUtils.getRealPath(servletContext, "/");
            if (!rootPath.endsWith(File.separator)) rootPath += File.separator;
            String path = rootPath + relativePath;
            return new FileInputStream(path);
        }
    
    }
    
  2. ==============================

    2.mazatwork 솔루션을 기반으로하는 내 코드 :

    mazatwork 솔루션을 기반으로하는 내 코드 :

    public class RelativeResource extends AbstractResource {
        private final String relativePath;
    
        public RelativeResource(String relativePath) {
            this.relativePath = relativePath;
        }
    
        @Override
        public String getDescription() {
            return "RelativeResource [" + relativePath + "]";
        }
    
        @Override
        public boolean isReadable() {
            File resourceFile = new File(getAbsoluteFileLocation());
            return resourceFile.exists();
        }
    
        @Override
        public boolean isOpen() {
            return true;
        }
    
        @Override
        public InputStream getInputStream() throws IOException {
            return new FileInputStream(getAbsoluteFileLocation());
        }
    
        private String getAbsoluteFileLocation() {
            return Paths.get("").toAbsolutePath().resolve(relativePath).toString();
        }
    }
    

    그 다음에는 xml로 쓸 수 있습니다.

    <bean id="configurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="locations">
            <list>
                <value>classpath:application.properties</value>
                <value type="com.blabla.RelativeResource">overrideProperties.properties</value>
            </list>
        </property>
        <property name="ignoreResourceNotFound" value="true"/>
    </bean>
    

    이 방법의 장점은 Spring 컨텍스트를 해킹하지 않고 해킹 된 컨텍스트 구현에 집착하지 않는다는 것입니다. Spring 배포의 모든 (예 : XmlWebApplicationContext가 아니라 ClassPathXmlApplicationContext)를 사용할 수 있습니다.

  3. ==============================

    3.구성에서 구성 파일을 기준으로하지 않고 클래스 경로에서 특성을 지정할 수 있습니다.

    구성에서 구성 파일을 기준으로하지 않고 클래스 경로에서 특성을 지정할 수 있습니다.

    <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
      <property name="locations" value="classpath:com/foo/jdbc.properties"/>
    </bean>
    

    이 작업을 수행하려면 특성 파일이 클래스 경로에 있는지 확인해야합니다.

  4. ==============================

    4.어쨌든 다른 사람들의 방법에 따라 원하는 경로를 얻을 수 없었으므로 isReadable () 및 getInputStream ()은 mazatwork의 버전과 비슷하게 보이지만 Dmitry의 답변 (xml 사용법은 동일 함)을 기반으로하는 작업 버전이 여기에 있습니다.

    어쨌든 다른 사람들의 방법에 따라 원하는 경로를 얻을 수 없었으므로 isReadable () 및 getInputStream ()은 mazatwork의 버전과 비슷하게 보이지만 Dmitry의 답변 (xml 사용법은 동일 함)을 기반으로하는 작업 버전이 여기에 있습니다.

    public class RelativeResource extends AbstractResource {
        private final String relativePath;
    
        public RelativeResource(String relativePath) {
            this.relativePath = relativePath;
        }
    
        @Override
        public String getDescription() {
            return "RelativeResource [" + relativePath + "]";
        }
    
        @Override
        public boolean isReadable() {
            return true;
        }
    
        @Override
        public boolean isOpen() {
            return true;
        }
    
        @Override
        public InputStream getInputStream() throws IOException {
            String rootPath = this.getClass().getResource("/").getPath();
            rootPath = URLDecoder.decode(rootPath, "UTF-8");
            if (!rootPath.endsWith(File.separator)) rootPath += File.separator;
            String path = rootPath + relativePath;
            return new FileInputStream(path);
        }
    }
    
  5. from https://stackoverflow.com/questions/17443534/propertyplaceholderconfigurer-use-external-properties-file by cc-by-sa and MIT license