[JAVA] 解决@ConfigurationProperties注解的使用及乱码问题

1801 0
Honkers 2022-11-9 09:17:18 | 显示全部楼层 |阅读模式
目录

    @ConfigurationProperties解决方法第二种不推荐写法


@ConfigurationProperties

作用:用于获取配置文件中的属性定义并绑定到javaBean属性中
举个栗子:
配置文件
  1. mycar.name=徐昂
  2. mycar.price=18w
复制代码
定义实体类
  1. package com.maggie.demo.entity;
  2. import lombok.Data;
  3. import org.springframework.boot.context.properties.ConfigurationProperties;
  4. import org.springframework.stereotype.Component;
  5. @Data   //生成setget方法
  6. @Component //将此类注册为组件
  7. @ConfigurationProperties(prefix = "mycar",ignoreUnknownFields = true) //配置文件属性读取,读取前缀时mycar的,忽略不存在的字段
  8. public class Car {
  9.     private String name;
  10.     private String  price;
  11.     @Override
  12.     public String toString() {
  13.         return "Car{" +
  14.                 "name='" + name + '\'' +
  15.                 ", price='" + price + '\'' +
  16.                 '}';
  17.     }
  18. }
复制代码
启动类输出验证
  1. package com.maggie.demo;
  2. import com.maggie.demo.entity.Car;
  3. import org.springframework.boot.SpringApplication;
  4. import org.springframework.boot.autoconfigure.SpringBootApplication;
  5. import org.springframework.context.ConfigurableApplicationContext;
  6. import java.io.IOException;
  7. @SpringBootApplication
  8. public class DemoApplication {
  9.         public static void main(String[] args) throws IOException {
  10.                 ConfigurableApplicationContext run = SpringApplication.run(DemoApplication.class, args);
  11.                 Car car = run.getBean(Car.class);
  12.                 System.out.println(car.toString());
  13.         }
  14. }
复制代码
输出结果
Car{name='', price='18w'}
产生问题,定义中文时,会产生乱码

解决方法

1,将配置文件换成yml文件,则不会产生乱码问题
  1. mycar:
  2.   name: '徐昂'
  3.   price: '18w'
复制代码
2, 覆盖原文件:org.springframework.boot.env.OriginTrackedPropertiesLoader
将OriginTrackedPropertiesLoader所有代码复制出来,按照包路径建立自己的包和类(包名和类名都必须和原来的一致,不然不生效)


然后找出原来的OriginTrackedPropertiesLoader上的编码片段:
  1.         CharacterReader(Resource resource) throws IOException {
  2.             this.reader = new LineNumberReader(new InputStreamReader(resource.getInputStream(), StandardCharsets.ISO_8859_1));
  3.         }
复制代码
将其改为 : StandardCharsets.UTF_8
  1.     CharacterReader(Resource resource) throws IOException {
  2.             this.reader = new LineNumberReader(new InputStreamReader(resource.getInputStream(), StandardCharsets.UTF_8));
  3.         }
复制代码
重启项目,发现项目中文乱码已经解决
  1. Car{name='徐昂', price='18w'}
复制代码
3, 自定义配置类


配置类
  1. mycar.name=小汽车
  2. mycar.price=18w
复制代码
定义实体,添加**@PropertySource**注解,指定字符集取utf-8,并指定读取配置文件的路径。
注意这种方法只能对自定义的properties文件有效,对于spring boot默认生成的application.properties没有效果
  1. @Data   //生成setget方法
  2. @Component //将此类注册为组件
  3. //指定字符集,并且指定读取的配置文件
  4. @PropertySource(encoding = "UTF-8", value = "classpath:car.properties", ignoreResourceNotFound = true)
  5. @ConfigurationProperties(prefix = "mycar",ignoreUnknownFields = true) //配置文件属性读取,读取前缀是mycar的
  6. public class Car {
  7.     private String name;
  8.     private String  price;
  9.     @Override
  10.     public String toString() {
  11.         return "Car{" +
  12.                 "name='" + name + '\'' +
  13.                 ", price='" + price + '\'' +
  14.                 '}';
  15.     }
  16. }
复制代码
结果:
Car{name='小汽车', price='18w'}

第二种不推荐写法

@ConfigurationProperties+ @EnableConfigurationProperties
@EnableConfigurationProperties作用:开启组件配置绑定功能,将实体类组件注入到容器中
eg:
  1. mycar.name=小汽车
  2. mycar.price=18w
复制代码
实体类
  1. package com.maggie.demo.entity;
  2. import lombok.Data;
  3. import org.springframework.boot.context.properties.ConfigurationProperties;
  4. import org.springframework.stereotype.Component;
  5. @Data   //生成setget方法
  6. @ConfigurationProperties(prefix = "mycar",ignoreUnknownFields = true) //配置文件属性读取,读取前缀时mycar的,忽略不存在的字段
  7. public class Car {
  8.     private String name;
  9.     private String  price;
  10.     @Override
  11.     public String toString() {
  12.         return "Car{" +
  13.                 "name='" + name + '\'' +
  14.                 ", price='" + price + '\'' +
  15.                 '}';
  16.     }
  17. }
复制代码
配置类
  1. @Configuration //配置类注解 ==配置文件
  2. @EnableConfigurationProperties(Car.class) //开启加载配置类
  3. public class BeansConfiguration {
  4. }
复制代码
以上为个人经验,希望能给大家一个参考,也希望大家多多支持中国红客联盟。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Honkers

荣誉红客

关注
  • 4004
    主题
  • 36
    粉丝
  • 0
    关注
这家伙很懒,什么都没留下!

中国红客联盟公众号

联系站长QQ:5520533

admin@chnhonker.com
Copyright © 2001-2025 Discuz Team. Powered by Discuz! X3.5 ( 粤ICP备13060014号 )|天天打卡 本站已运行