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

 更新时间:2022年10月27日 15:14:16   作者:多罗罗~  
这篇文章主要介绍了解决@ConfigurationProperties注解的使用及乱码问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

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

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Java中抓取 Thread Dumps 的方式汇总

    Java中抓取 Thread Dumps 的方式汇总

    Thread dumps(线程转储)能帮助我们判断 CPU 峰值、死锁、内存异常、应用反应迟钝、响应时间变长和其他系统问题。在这篇文章当中,总结了7中抓取 Java Thread Dumps 文件的方式,分享给大家,希望对大家学习Java能够有所帮助。
    2016-06-06
  • Java开发中的OOM内存溢出问题详解

    Java开发中的OOM内存溢出问题详解

    这篇文章主要介绍了Java开发中的OOM内存溢出问题详解,OOM,全称 Out Of Memory,意思是内存耗尽或内存溢出,当JVM因为没有足够的内存来为对象分配空间并且垃圾回收器也已经没有空间可回收时,就会抛出这个 error,需要的朋友可以参考下
    2023-08-08
  • struts2 中文乱码的解决办法分享

    struts2 中文乱码的解决办法分享

    这篇文章主要介绍了struts2 中文乱码的解决办法,需要的朋友可以参考下
    2014-02-02
  • Spring中的自动装配机制详解

    Spring中的自动装配机制详解

    这篇文章主要介绍了Spring中的自动装配机制详解,自动装配就是会通过Spring的上下文为你找出相应依赖项的类,通俗的说就是Spring会在上下文中自动查找,并自动给Bean装配与其相关的属性,需要的朋友可以参考下
    2023-08-08
  • java 中modCount 详解及源码分析

    java 中modCount 详解及源码分析

    这篇文章主要介绍了java 中modCount 详解及源码分析的相关资料,需要的朋友可以参考下
    2017-02-02
  • SpringBoot集成swagger-ui以及swagger分组显示操作

    SpringBoot集成swagger-ui以及swagger分组显示操作

    这篇文章主要介绍了SpringBoot集成swagger-ui以及swagger分组显示操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-09-09
  • Java 如何同时返回多个不同类型

    Java 如何同时返回多个不同类型

    这篇文章主要介绍了Java 同时返回多个不同类型的方法,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-08-08
  • 关于连接池详解(HikariCP、Druid)

    关于连接池详解(HikariCP、Druid)

    这篇文章主要介绍了关于连接池详解(HikariCP、Druid),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-03-03
  • IDEA性能优化方法解决卡顿问题

    IDEA性能优化方法解决卡顿问题

    本文主要介绍了如何在不升级电脑配置的情况下通过修改IntelliJIDEA的设置来优化其性能,从而提升开发效率
    2024-12-12
  • java Class文件结构解析常量池字节码

    java Class文件结构解析常量池字节码

    这篇文章主要为大家介绍了java Class文件的整体结构解析常量池字节码详细讲解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-07-07

最新评论