解决@ConfigurationProperties注解的使用及乱码问题
作者:多罗罗~ 发布时间:2023-09-08 06:55:10
@ConfigurationProperties
作用:用于获取配置文件中的属性定义并绑定到javaBean属性中
举个栗子:
配置文件
mycar.name=徐昂
mycar.price=18w
定义实体类
package com.maggie.demo.entity;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
@Data //生成setget方法
@Component //将此类注册为组件
@ConfigurationProperties(prefix = "mycar",ignoreUnknownFields = true) //配置文件属性读取,读取前缀时mycar的,忽略不存在的字段
public class Car {
private String name;
private String price;
@Override
public String toString() {
return "Car{" +
"name='" + name + '\'' +
", price='" + price + '\'' +
'}';
}
}
启动类输出验证
package com.maggie.demo;
import com.maggie.demo.entity.Car;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;
import java.io.IOException;
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) throws IOException {
ConfigurableApplicationContext run = SpringApplication.run(DemoApplication.class, args);
Car car = run.getBean(Car.class);
System.out.println(car.toString());
}
}
输出结果
Car{name='徿˜‚', price='18w'}
产生问题,定义中文时,会产生乱码
解决方法
1,将配置文件换成yml文件,则不会产生乱码问题
mycar:
name: '徐昂'
price: '18w'
2, 覆盖原文件:org.springframework.boot.env.OriginTrackedPropertiesLoader
将OriginTrackedPropertiesLoader所有代码复制出来,按照包路径建立自己的包和类(包名和类名都必须和原来的一致,不然不生效)
然后找出原来的OriginTrackedPropertiesLoader上的编码片段:
CharacterReader(Resource resource) throws IOException {
this.reader = new LineNumberReader(new InputStreamReader(resource.getInputStream(), StandardCharsets.ISO_8859_1));
}
将其改为 : StandardCharsets.UTF_8
CharacterReader(Resource resource) throws IOException {
this.reader = new LineNumberReader(new InputStreamReader(resource.getInputStream(), StandardCharsets.UTF_8));
}
重启项目,发现项目中文乱码已经解决
Car{name='徐昂', price='18w'}
3, 自定义配置类
配置类
mycar.name=小汽车
mycar.price=18w
定义实体,添加**@PropertySource**注解,指定字符集取utf-8,并指定读取配置文件的路径。
注意:这种方法只能对自定义的properties文件有效,对于spring boot默认生成的application.properties没有效果
@Data //生成setget方法
@Component //将此类注册为组件
//指定字符集,并且指定读取的配置文件
@PropertySource(encoding = "UTF-8", value = "classpath:car.properties", ignoreResourceNotFound = true)
@ConfigurationProperties(prefix = "mycar",ignoreUnknownFields = true) //配置文件属性读取,读取前缀是mycar的
public class Car {
private String name;
private String price;
@Override
public String toString() {
return "Car{" +
"name='" + name + '\'' +
", price='" + price + '\'' +
'}';
}
}
结果:
Car{name='小汽车', price='18w'}
第二种不推荐写法
@ConfigurationProperties+ @EnableConfigurationProperties
@EnableConfigurationProperties作用:开启组件配置绑定功能,将实体类组件注入到容器中
eg:
mycar.name=小汽车
mycar.price=18w
实体类
package com.maggie.demo.entity;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
@Data //生成setget方法
@ConfigurationProperties(prefix = "mycar",ignoreUnknownFields = true) //配置文件属性读取,读取前缀时mycar的,忽略不存在的字段
public class Car {
private String name;
private String price;
@Override
public String toString() {
return "Car{" +
"name='" + name + '\'' +
", price='" + price + '\'' +
'}';
}
}
配置类
@Configuration //配置类注解 ==配置文件
@EnableConfigurationProperties(Car.class) //开启加载配置类
public class BeansConfiguration {
}
来源:https://blog.csdn.net/qq_51347907/article/details/125678472


猜你喜欢
- 本文实例讲述了C#获取路径的几种方式。分享给大家供大家参考。具体如下:string str1 =Process.GetCurrentProc
- 前言在 Java 开发领域,热部署一直是一个难以解决的问题,目前的 Java 虚拟机只能实现方法体的修改热部署,例如使用devtool来实现
- 本文实例讲述了Android编程之SMS读取短信并保存到SQLite的方法。分享给大家供大家参考,具体如下:Android 之 SMS 短信
- 什么是RESTful APIRESTful API是一种基于HTTP协议的Web API,它的设计原则是简单、可扩展、轻量级、可缓存、可靠、
- 堆区:只存放类对象,线程共享;方法区:又叫静态存储区,存放class文件和静态数据,线程共享;栈区:存放方法局部变量,基本类型变量区、执行环
- 堆排序是一种树形选择排序方法,它的特点是:在排序的过程中,将array[0,...,n-1]看成是一颗完全二叉树的顺序存储结构,利用完全二叉
- Android Studio 3.6正式版已经发布https://android-developers.googleblog.com/202
- 简介通过 pulsar-flink-connector 读取到 Apache pulsar 中的namespaces、topics的元数据信
- Android 中启动自己另一个程序的activity如何实现可以使用action,举例: 1. 比如建立activity4,我
- 前言本来没有计划这一篇文章的,只是在看完SpringBoot核心原理后,突然想到之前开发中遇到的MVC自动失效的问题,虽然网上有很多文章以及
- 功能要求: (1)比如每页显示2X2,总共2XN,每个item显示图片+文字(点击有链接)。 如果单行水平滚动,可以用Horizontals
- 线程可以理解为下载的通道,一个线程就是一个文件的下载通道,多线程也就是同时开启好几个下载通道。当服务器提供下载服务时,使用下载者是共享带宽的
- 到现在为止,笔者不敢给流下定义,从概念来讲他应该也是一种数据元素才是。可是在我们前面的代码例子中我们可以看到他更多的好像在表示他是一组处理数
- java 中死锁问题的实例详解先看代码在做解释public class DeadLock implements Runnable{ &nbs
- 平时写项目的时候,java之父叫我们多打日志,我们通常使用traceId和requestId来保存完整请求的链路日志,例如市面上的skywa
- C#编写winform程序时,用到的,格式强转,存储到数据库,数据库连接那块就不写了希望对大家有帮助,欢迎评论互相分享技术!//日期格式强制
- 一、图片预览:一、实现功能:需求要实现布局中为圆形图片,图片背景与图标分开且合并到一个ImageView。二、具体实现:XML中布局中定义I
- Android CheckBox中设置padding无效解决办法CheckBox使用本地图片资源CheckBox是Android中用的比较多
- 前言在java里,当我们需要拷贝一个对象时,有两种类型的拷贝:浅拷贝与深拷贝。浅拷贝只是拷贝了源对象的地址,所以源对象的值发生变化时,拷贝对
- 使用mybatis生成逆向工程的详细步骤,我个人感觉这个是最简单的一个了,虽然网上有很多种的方法来生成逆向工程,可是这个方法最简单。在这里我