文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

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

2022-11-13 18:58

关注

@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 {
    
}

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     801人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     348人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     311人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     432人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     220人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯