解决SpringBoot中application.properties中存在中文配置使用@Value注解读取配置中文乱码

解决SpringBoot中application.properties中存在中文配置使用@Value注解读取配置中文乱码

最近在做一个项目需要根据区域名称过滤掉一些区域,想到采用配置方法来解决,因此在,application.properties文件中添加,如下配置:

# 需要过滤的区域名称字段
filter.region.name=检测机构,检测站,检车站,检车,服务机构,查验机构,安检,服务站,查验区,车管所,报废库,监测,检测
# 需要过滤的点位名称字段
filter.camera.name=查验,检验

使用@Value注解导入配置

    @Value("${filter.region.name}")
    private String filterRegionName;
    @Value("${filter.camera.name}")
    private String filterCameraName;

调用获取区域信息时发现,根本没有按照区域名称过滤掉配置文件中的相关区域。

原因分析

Spring读取application.properties中间默认编码是ISO-8859-1,如果需要中文显示,需要设置spring读取配置设置编码为UTF-8,于是在application.properties中添加如下配置:

banner.charset=UTF-8
server.tomcat.uri-encoding=UTF-8
spring.http.encoding.charset=UTF-8
spring.http.encoding.enabled=true
spring.http.encoding.force=true
spring.messages.encoding=UTF-8

添加完成后,依然无效。

解决方法

大部分解决该问题方法无非两种:

  • 添加额外配置test.properties
  • 修改application.properties文件为application.yml,yml读取配置文件编码是UTF-8

我发现了一种简单的方法,可以避免添加或者修改配置文件后缀方法,修改application.properties中中文编码换成ASCII码,如下修改:

# 需要过滤的区域名称字段
#filter.region.name=检测机构,检测站,检车站,检车,服务机构,查验机构,安检,服务站,查验区,车管所,报废库,监测,检测
filter.region.name=\u68c0\u6d4b\u673a\u6784,\u68c0\u6d4b\u7ad9,\u68c0\u8f66\u7ad9,\u68c0\u8f66,\u670d\u52a1\u673a\u6784,\u67e5\u9a8c\u673a\u6784,\u5b89\u68c0,\u670d\u52a1\u7ad9,\u67e5\u9a8c\u533a,\u8f66\u7ba1\u6240,\u62a5\u5e9f\u5e93,\u76d1\u6d4b,\u68c0\u6d4b
# 需要过滤的点位名称字段
#filter.camera.name=查验,检验
filter.camera.name=\u67e5\u9a8c,\u68c0\u9a8c

问题得以解决。

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
反射是一种编程技术,它允许程序在运行时动态地获取和操作类型(类)的信息,包括成员变量、方法、属性等。通过反射,程序可以在不提前知道类的具体信息的情况下,通过名称来访问和使用类的成员。 反射通常用于以下场景: 1. 动态加载类:在程序运行时,根据配置或用户输入等条件,动态加载需要使用的类。例如,通过反射来实现插件式架构,允许用户在运行时加载不同的插件。 2. 调用私有方法或访问私有成员:通过反射可以绕过访问修饰符的限制,调用私有方法或访问私有成员。例如,在单元测试,我们可能需要测试一个私有方法的逻辑。 3. 动态创建实例:通过反射可以动态地创建对象实例。这在一些框架和库非常常见,例如依赖注入(DI)容器会根据配置文件的信息动态创建对象。 4. 获取和修改属性值:通过反射可以获取和修改对象的属性值,即使这些属性是私有的。这在一些需要动态地读取和修改对象属性的情况下非常有用。 5. 在运行时处理注解:通过反射可以获取类和成员上的注解信息,并根据注解的定义做出相应的处理。这在一些框架和库用于实现自定义的业务逻辑。 举例来说,Java语言的反射API可以通过Class类来获取类的信息,如下所示: ```java Class<?> clazz = MyClass.class; // 获取类名 String className = clazz.getName(); // 获取类的所有方法 Method[] methods = clazz.getDeclaredMethods(); // 获取类的所有字段 Field[] fields = clazz.getDeclaredFields(); // 创建对象实例 Object instance = clazz.newInstance(); // 调用方法 Method method = clazz.getDeclaredMethod("methodName", parameterTypes); method.setAccessible(true); Object result = method.invoke(instance, arguments); // 获取和设置属性值 Field field = clazz.getDeclaredField("fieldName"); field.setAccessible(true); Object value = field.get(instance); field.set(instance, newValue); ``` 通过反射,我们可以在运行时获取和操作类的信息,以实现动态性和灵活性。然而,反射的使用需要谨慎,因为它会牺牲一定的性能,并且可能导致类型安全问题。因此,在使用反射时应该权衡利弊,并确保正确处理异常情况。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值