[SPRING] PropertyPlaceholderConfigurer : 외부 속성 파일 사용
SPRINGPropertyPlaceholderConfigurer : 외부 속성 파일 사용
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.마지막으로 새로운 자원 유형 "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.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.구성에서 구성 파일을 기준으로하지 않고 클래스 경로에서 특성을 지정할 수 있습니다.
구성에서 구성 파일을 기준으로하지 않고 클래스 경로에서 특성을 지정할 수 있습니다.
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <property name="locations" value="classpath:com/foo/jdbc.properties"/> </bean>
이 작업을 수행하려면 특성 파일이 클래스 경로에 있는지 확인해야합니다.
-
==============================
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); } }
from https://stackoverflow.com/questions/17443534/propertyplaceholderconfigurer-use-external-properties-file by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] JBoss 6 + Spring 3.0.5 + JAX-WS / CXF (0) | 2019.02.21 |
---|---|
[SPRING] 응용 프로그램을 전개하는 java.lang.AbstractMethodError (Spring 4 MVC + Hibernate 4/5) (0) | 2019.02.21 |
[SPRING] 현재 브라우저 탭을 닫는 방법? (버디 7) (0) | 2019.02.20 |
[SPRING] 은행과 같은 제 3 자와 Spring Ws에서 인증서를 송수신하는 방법은 무엇입니까? (0) | 2019.02.20 |
[SPRING] Spring 부트 응용 프로그램 - 나머지 API 끝점의 기본 시간 제한 또는 모든 끝점 시간 초과를 제어하는 쉬운 구성 (0) | 2019.02.20 |