【避坑指南】配置读写分离

愿天堂没有BUG

共 3377字,需浏览 7分钟

 ·

2021-10-12 13:46

前言

今天分享的并不是小知识,而是踩过的两个坑,我先踩为敬,希望各位看完勿入、勿入!

坑点 1

1.1 描述

使用 @ConfigurationProperties(prefix = "") 批量注入 application.yml 中配置属性,刚写完这行代码,文件标签栏下方立马出现如下报错信息:

报错信息的中文大意是:在类路径当中找不到 Spring Boot 配置注解处理器

虽然不影响注入配置属性值,但是很影响代码美观,造成身心的不愉悦!

1.2 填坑

点击,报错文本后面链接:

紧接着打开这个页面:

啊这,行吧……那我就直接给出两种解决方案:

  • 掩耳盗铃式,打开面板设置(点击上图中扳手图标快速进入),操作如下:

  • 治标又治本式,在 pom.xml 文件中加入 spring-boot-configuration-processor 依赖:

    
org.springframework.boot
spring-boot-configuration-processor
true

复制代码

坑点 2

2.1 描述

关于:配置文件中属性如何映射到配置类中的静态成员变量上?

配置文件 application.yml

    # 项目相关配置
project:
# 名称
name: DemoProject
# 版本
version: 1.1.0
# 版权年份
copyrightYear: 2021
# 文件路径 示例( Windows配置E:/test/uploadPath,Linux配置 /home/test/uploadPath)
profile: E:/test/uploadPath
复制代码

配置类 ProjectConfig

    @Component
@ConfigurationProperties(prefix = "project")
public class ProjectConfig {

/** 项目名称 */
private String name;

/** 版本 */
private String version;

/** 版权年份 */
private String copyrightYear;

/** 上传路径 */
private static String profile;

public String getName()
{
return name;
}

public void setName(String name)
{
this.name = name;
}

public String getVersion()
{
return version;
}

public void setVersion(String version)
{
this.version = version;
}

public String getCopyrightYear()
{
return copyrightYear;
}

public void setCopyrightYear(String copyrightYear)
{
this.copyrightYear = copyrightYear;
}

public static String getProfile() {
return profile;
}

public static void setProfile(String profile) {
ProjectConfig.profile = profile;
}

/**
* 获取导入上传路径
*/
public static String getImportPath()
{
return getProfile() + "/import";
}

/**
* 获取头像上传路径
*/
public static String getAvatarPath()
{
return getProfile() + "/avatar";
}

/**
* 获取下载路径
*/
public static String getDownloadPath()
{
return getProfile() + "/download/";
}

/**
* 获取上传路径
*/
public static String getUploadPath()
{
return getProfile() + "/upload";
}
}
复制代码

这个配置类包含四个成员变量,分别对应配置文件中的 project 下的属性,前三个为普通变量,profile 为静态属性,因为使用后期使用频率较多,为了使用 类名. 的形式调用方便且快捷地拿到全局配置的文件路径。

注意:千万别漏了 @Component 注解,该注解将 ProjectConfig 放到 Spring 容器之中,交由 Spring 管理。

@Value 和 @ConfigurationProperties 两者的区别?

@Value 注解可以通过全限定名进行配置的绑定,属于 显式绑定@ConfigurationProperties 注解其实就是相当于使用了多个 @Value 同时绑定,属于 隐式绑定 的,这就意味着在编写配置文件时,只需和类中的属性名保持一致即可,如果类中的属性名采用的是驼峰命名法,则使用短横(-)连接即可。

纸上得来终觉浅,正当我运行测试用例,准备得意洋洋看到控制台输出 ProjectConfig.getProfile() 文件路径结果时,null 一闪而过,我直接愣住,人傻掉……

2.2 填坑

尝试了很多中方法仍然无效,但是通过自动注入能拿到非静态的其他属性值,山重水复疑无路之际,我决定寻求同学的帮助,从他口中得知是静态属性的缘故,就在我思考 “静态属性就一定注入不了值吗?”,纳闷的我看到了 profileset 方法,其他的属性都是通过赋值方法进行值注入的,那么眼前这个方法为何不可呢?原来是我把它的赋值方法标明为 static 了,导致配置属性注入时无法调用该方法。

去掉 static 关键字,我拿到了我想要的文件路径:

结尾

撰文不易,欢迎大家点赞、评论,你的关注、点赞是我坚持的不懈动力,感谢大家能够看到这里!Peace & Love。


作者:HUALEI
链接:https://juejin.cn/post/7016989512232337415
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。



浏览 9
点赞
评论
收藏
分享

手机扫一扫分享

举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

举报