Trong bài viết này, mình sẽ hướng dẫn các bạn cách đọc properties file trong Spring sử dụng context namespace.
Nhưng trước tiên, chúng ta hãy tạo một project ví dụ trước nhé các bạn!
Mình sẽ sử dụng Java 17 cho ví dụ này:
1 2 3 4 |
<properties> <maven.compiler.source>17</maven.compiler.source> <maven.compiler.target>17</maven.compiler.target> </properties> |
Spring framework dependency:
1 2 3 4 5 |
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>6.0.3</version> </dependency> |
Class Application:
1 2 3 4 5 6 7 8 9 10 11 |
package com.huongdanjava.spring; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class Application { public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext("spring.xml"); } } |
Trong ví dụ của mình thì tập tin spring.xml chính là tập tin cấu hình của Spring còn tập tin configuration.properties là tập tin cấu hình của ứng dụng. Nội dung của những tập tin này như sau:
spring.xml
1 2 3 4 5 |
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> </beans> |
configuration.properties
1 |
app.author=Khanh Nguyen |
Bây giờ, mình sẽ hướng dẫn cấu hình context namespace trong tập tin cấu hình của Spring để nó có thể đọc những properties có trong tập tin configuration.properties lên, sau đó ứng dụng của chúng ta có thể sử dụng nhé các bạn!
Đầu tiên, các bạn cần phải khai báo sử dụng context namespace là một thuộc tính của thẻ <beans> như sau:
1 2 3 4 5 6 7 |
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> </beans> |
Rồi bây giờ, các bạn hãy sử dụng context namespace để đọc tập tin properties như sau:
1 |
<context:property-placeholder location="classpath:configuration.properties" /> |
Trong khai báo này, mình đã sử dụng một thẻ <context:property-placeholder> của context namespace để khai báo đường dẫn của tập tin properties.
Tương tự như đối tượng PropertyPlaceHolderConfigurer, nếu đường dẫn của tập tin properties không tồn tại thì khi chạy ứng dụng, chúng ta sẽ gặp lỗi ngay. Ví dụ bây giờ mình sửa lại đường dẫn của tập tin properties như sau:
1 |
<context:property-placeholder location="classpath:configuration1.properties" /> |
thì khi chạy các bạn sẽ gặp lỗi sau:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
Feb 23, 2018 5:18:11 AM org.springframework.context.support.AbstractApplicationContext prepareRefresh INFO: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@45283ce2: startup date [Fri Feb 23 05:18:11 ICT 2018]; root of context hierarchy Feb 23, 2018 5:18:11 AM org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions INFO: Loading XML bean definitions from class path resource [spring.xml] Feb 23, 2018 5:18:11 AM org.springframework.context.support.AbstractApplicationContext refresh WARNING: Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanInitializationException: Could not load properties; nested exception is java.io.FileNotFoundException: class path resource [configuration1.properties] cannot be opened because it does not exist Exception in thread "main" org.springframework.beans.factory.BeanInitializationException: Could not load properties; nested exception is java.io.FileNotFoundException: class path resource [configuration1.properties] cannot be opened because it does not exist at org.springframework.context.support.PropertySourcesPlaceholderConfigurer.postProcessBeanFactory(PropertySourcesPlaceholderConfigurer.java:153) at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(PostProcessorRegistrationDelegate.java:284) at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(PostProcessorRegistrationDelegate.java:164) at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:693) at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:531) at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:144) at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:85) at com.huongdanjava.spring.Application.main(Application.java:9) Caused by: java.io.FileNotFoundException: class path resource [configuration1.properties] cannot be opened because it does not exist at org.springframework.core.io.ClassPathResource.getInputStream(ClassPathResource.java:180) at org.springframework.core.io.support.EncodedResource.getInputStream(EncodedResource.java:159) at org.springframework.core.io.support.PropertiesLoaderUtils.fillProperties(PropertiesLoaderUtils.java:99) at org.springframework.core.io.support.PropertiesLoaderSupport.loadProperties(PropertiesLoaderSupport.java:181) at org.springframework.core.io.support.PropertiesLoaderSupport.mergeProperties(PropertiesLoaderSupport.java:162) at org.springframework.context.support.PropertySourcesPlaceholderConfigurer.postProcessBeanFactory(PropertySourcesPlaceholderConfigurer.java:144) ... 7 more |
Để bỏ qua lỗi này, các bạn có thể khai báo thêm một thuộc tính nữa cho thẻ <context:propery-holder> như sau:
1 |
<context:property-placeholder location="classpath:configuration1.properties" ignore-resource-not-found="true" /> |
khi đó, Spring chỉ hiển thị một message để cho chúng ta biết có một tập tin properties không tồn tại như sau:
1 2 3 4 5 6 |
Feb 23, 2018 5:18:41 AM org.springframework.context.support.AbstractApplicationContext prepareRefresh INFO: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@45283ce2: startup date [Fri Feb 23 05:18:41 ICT 2018]; root of context hierarchy Feb 23, 2018 5:18:41 AM org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions INFO: Loading XML bean definitions from class path resource [spring.xml] Feb 23, 2018 5:18:41 AM org.springframework.core.io.support.PropertiesLoaderSupport loadProperties INFO: Properties resource not found: class path resource [configuration1.properties] cannot be opened because it does not exist |
Để đọc được nhiều tập tin properties cùng lúc thì các bạn cũng sử dụng thuộc tính location của thẻ <context:property-holder> và khi đó đường dẫn của các tập tin properties sẽ được ngăn cách bởi dấu phẩy nhé!
Ví dụ nếu mình có thêm một tập tin database.properties trong ví dụ của mình thì mình sẽ khai báo context namespace như sau:
1 |
<context:property-placeholder location="classpath:configuration.properties,classpath:database.properties" ignore-resource-not-found="true" /> |