目前Spring体系下基础技术栈有SpringMVC、SpringBoot(以及SpringCloud)两种,在读取配置文件的方式上有些差异,但是整体保持一致。最近遇到在读取配置文件时发生乱码的问题,其实解决方式也比较简单。
1)对于properties文件,无论何种配置方式,Spring底层均使用Resource方式进行加载,最终基于JAVA本身的“classLoader.getResourceAsStream()”读取信息,编码默认为“ISO-8859-1”,编码方式可以通过配置指定。
参见ConfigurationClassParser.java、ClassPathResource.java等。
2)对于yml、xml文件,即配置文件的后缀以“yml”、“yaml”、“xml”(包括“properties”)结尾的配置文件,这种类型的配置目前只能在springboot技术栈中支持,编码方式为“UTF-8”,参见PropertiesPropertySourceLoader.java、YamlPropertySourceLoader.java。
所以,对于编码问题,我们对于properties文件要特别注意,需要强制指定编码为“UTF-8”,否则可能出现本地环境运行正常、但是发布环境总是乱码的奇怪问题。
一、基于XML方式
SpringMVC环境下,通常可以使用Bean-XML和注释两种方式来获取Properties属性,我们假定在resources目录下已存在“test.properties”文件:
test.name=Hi,你好,世界!
Bean XML方式(一)
1、Spring-Context.xml
<context:annotation-config /> <context:property-placeholder location="classpath:test.properties" ignore-unresolvable="true" file-encoding="UTF-8"/>
2、TestService.java
@Service public class TestService { @Value("${test.name}") private String testName; ... }
Bean XML方式(二)
1、Spring-Context.xml
<bean id="globalProperties" class="org.springframework.beans.factory.config.PropertiesFactoryBean"> <property name="fileEncoding" value="UTF-8"/> <property name="locations"> <array> <value>classpath:test2.properties</value> </array> </property> </bean>
2、TestService.java
@Service public class TestService { @Value("#{globalProperties['test.name']}") private String testName; ... }
我们需要特别注意,如果在SpringMVC的Web项目中@Controllor层需要使用@Value注入属性时,我们需要将上述配置放在Servlet相关的Spring文件中,这个文件名通常与下属配置一致:
<servlet> <servlet-name>spring-mvc</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:spring-web.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet>
以此例,那么@Controller需要使用Properties属性时,它们的配置信息应该放置在spring-web.xml中,你放置在Spring-context.xml等类似于的文件是不可行的,因为SpringMVC中“Servlet容器”和“Spring组件容器”来自不同的BeanFactory,所以@Controllor和@Service、@Component、@Resource等需要区别对待。
为了避免乱码,我们需要在所有声明properties加载的地方,都强制指定encoding,此外建议大家将spring基线版本升级到4.3.X+。
二、基于注释
Spring 3.1+提供了一个比较便捷的注解,@PropertySource,可以帮助我们在springMVC、springBoot环境下直接使用。
@PropertySource(value = "classpath:test3.properties",encoding = "UTF-8") @Controller public class IndexController { @Value("${test.name}") private String testName; .... }
@PropertySource注意可以在任意Spring Bean组件中使用;但是还是那句话,@Controller和@Service、@Component等可能需要各自配置;此外建议创建@Configuration的配置管理类,将这些Properties只加载一次、以Bean的方式export以供所有组件共享使用。不要忘记“encoding”属性。
相关推荐
- **编码问题**:Properties文件的编码格式应与Spring配置文件一致,避免因编码不匹配导致的乱码问题。 - **安全性考虑**:对于敏感信息如密码,应考虑加密存储,并在应用中解密使用,以增强系统的安全性。 - **动态...
在JavaScript环境中,没有内置的`Properties`类来直接处理`properties`文件。但可以通过第三方库,如`properties-parser`,或者自己编写解析函数来读取并解析文件内容。例如,使用Node.js的`fs`模块和`properties-...
在Java编程中,Properties文件是用于存储配置信息的...无论是保存还是读取,都需要确保与文件实际的编码一致。在处理这类问题时,了解和掌握不同的API以及它们的用法是至关重要的,这样才能确保程序的健壮性和正确性。
本文将详细介绍如何在Java中读取`properties`配置文件。 首先,我们需要了解`properties`文件的格式。一个标准的`.properties`文件通常包含多个行,每行由一个键和一个值组成,它们之间用等号(`=`)或冒号(`:`)...
本篇文章将详细探讨如何在Java中读取`properties`文件的值。 ### 1. `java.util.Properties` 类 Java提供了一个内置类 `java.util.Properties`,专门用于处理`.properties`文件。这个类继承了`HashTable`,并提供...
Spring Boot 使用 i18n 时 properties 文件中文乱码问题的解决方法 Spring Boot 是一个流行的 Java 框架,用于快速开发 Web 应用程序。然而,在使用 Spring Boot 时,遇到中文乱码问题的可能性很高,特别是在使用 ...
- Spring Boot支持配置文件的命名约定,如`application-{profile}.properties`或`application-{profile}.yml`,其中`{profile}`代表环境(如dev、test、prod)。 - 配置文件的加载顺序为:`application.properties...
标题 "sftp直接以url模式读取-----------包括servlet如何借用springproperties取文件" 提到的是在Java开发中,如何通过SFTP(Secure File Transfer Protocol)协议以URL模式读取远程文件,并结合SpringProperties来...
### Spring框架中注解出现中文乱码的问题解析与解决方案 #### 问题背景 在Spring框架的应用开发中,尤其是在处理HTTP请求时,经常会遇到通过JSON格式传递数据的情况。然而,在某些场景下,开发者可能会遇到中文...
在Spring Boot项目中,`application.properties`文件默认使用UTF-8编码,但如果编辑器、IDE或操作系统使用的默认编码不是UTF-8,就可能导致读取时的乱码。例如,如果你的IDE(如IntelliJ IDEA)的默认编码设置不是...
在Java编程中,读取配置文件是常见的任务,特别是在开发需要灵活配置的系统时。配置文件通常用于存储应用程序的设置...确保正确处理异常,保证资源及时关闭,以及在读取配置文件时考虑到安全问题,避免硬编码敏感信息。
### JAVA读取环境变量 #### 知识点概述 在Java程序中,有时我们需要根据不同的运行环境(如Windows或Linux)来获取系统环境变量。这些环境变量包含了操作系统配置的重要信息,比如路径设置、用户信息等。本文将...
在实际开发中,为了提高代码的可复用性和灵活性,我们还可以考虑将这两个工具类整合为一个,提供通用的配置文件读取接口,通过文件扩展名或配置文件内容自动识别是`.properties`还是`.yml`格式,并进行相应的读取...
在Spring框架中,属性文件(通常为`.properties`格式)被广泛用来存储应用程序的配置信息,如数据库连接、邮件设置等。这些配置信息可以独立于源代码,方便管理和修改。本文将详细介绍如何在Spring中读取和使用这些...
在Java编程中,读取`.properties`文件是常见的任务,这些文件通常用于存储配置信息,如数据库连接字符串、系统设置等。以下将详细介绍四种方法来读取`.properties`文件。 ### 方法一:使用`java.util.Properties` ...
6. **资源绑定**:在Spring框架中,可以使用`@Value`注解将`.properties`文件中的属性值注入到Java bean的字段或方法中,实现配置的动态绑定。 7. **国际化(i18n)**:`.properties`文件也常用于实现应用的多语言...
本文将深入探讨如何在Spring项目中实现properties文件的加密。 1. **理解Properties文件** Spring框架广泛使用`properties`文件来存储配置信息。这些文件通常是纯文本格式,容易被读取,从而增加了安全性风险。...
通过属性文件读取数据库连接信息,可以方便地管理和更新数据库配置,同时避免硬编码,提高代码的可维护性。在实际开发中,根据业务场景选择单数据源、多数据源或动态数据源,确保系统的稳定性和扩展性。
在Spring框架中,可以通过`@Value`注解方便地读取`.properties`文件中的配置信息。下面详细介绍如何实现这一功能。 ##### 2.1 配置文件内容 根据题目提供的部分内容,我们有一个名为`site.properties`的文件,其...
使用PropertyPlaceholderConfigurer可以解决一些问题,例如,每一次加载配置文件时,我们都需要手工读取配置文件,这样编码麻烦且代码不优雅。使用PropertyPlaceholderConfigurer可以将配置文件的路径放在java虚拟机...