解决@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所有代码复制出来,按照包路径建立自己的包和类(包名和类名都必须和原来的一致,不然不生效)

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

然后找出原来的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, 自定义配置类

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

配置类

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

标签:@ConfigurationProperties,注解,乱码
0
投稿

猜你喜欢

  • 文件路径正确,报java.io.FileNotFoundException异常的原因及解决办法

    2022-01-28 04:52:57
  • SpringBoot如何进行对象复制的实践

    2023-11-23 03:40:19
  • JAVA操作MongoDB数据库实例教程

    2023-11-18 13:22:27
  • 阿里开源Java诊断工具神器使用及场景详解

    2023-11-06 17:24:21
  • java中main函数你知道多少

    2023-05-26 12:32:15
  • C#中if语句使用概述

    2022-08-31 23:22:09
  • Spring Cloud Alibaba Nacos Config配置中心实现

    2022-08-02 00:43:05
  • Android编程之播放器MediaPlayer实现均衡器效果示例

    2022-02-25 11:52:32
  • Android 静默安装实现方法

    2021-08-04 05:11:25
  • Java 图表类库详解

    2021-11-09 00:25:11
  • SpringBoot实现Thymeleaf验证码生成

    2021-11-25 08:06:38
  • Android双向选择控件DoubleSeekBar使用详解

    2022-02-13 10:05:29
  • C#图像边缘检测(Roberts)的方法

    2022-12-26 15:11:18
  • Java String类字符串的理解与认知

    2022-05-10 17:27:12
  • Java中的动态和静态编译实例详解

    2021-07-30 15:25:10
  • AndroidStudio替换项目图标ic_launcher操作

    2023-03-20 09:48:07
  • java简单实现多线程及线程池实例详解

    2023-05-12 05:47:04
  • Android升级支持库版本遇到的两个问题详解

    2023-12-02 11:24:38
  • Android Studio下Flutter环境搭建图文教程

    2023-11-06 00:08:03
  • Android 创建与解析XML(四)——详解Pull方式

    2023-06-03 07:10:23
  • asp之家 软件编程 m.aspxhome.com