今天碰到一个很奇葩的问题。在使用spring-boot-configuration-processor生成spring-configuration-metadata.json文件的时候发现properties域没有正常生成。如下:
{
"groups": [
{
"name": "wall",
"type": "cn.twh.wall.config.WallConfig",
"sourceType": "cn.twh.wall.config.WallConfig"
}
],
"properties": [],
"hints": []
}
问题排查步骤:
1、排查pom文件是否依赖了
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
2、排查pom的build域是否使用了插件:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<proc>none</proc><!-- 该配置必须存在 -->
<source>${jdk.version}</source>
<target>${jdk.version}</target>
<encoding>utf-8</encoding>
</configuration>
</plugin>
3、排查配置类:
package cn.twh.wall.config;
import java.util.HashMap;
import java.util.Map;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.context.annotation.Configuration;
@RefreshScope
@Configuration
@ConfigurationProperties(prefix = "wall", ignoreUnknownFields = true)
public class WallConfig {
/**
* 默认失败率
*/
private int failRate;
/**
* 默认超时率
*/
private int timeOutRate;
/**
* 接口失败率
*/
private Map<String,Integer> interfaceFailRate = new HashMap<>();
/**
* 接口失败率
*/
private Map<String,Integer> interfaceTimeOutRate = new HashMap<>();
/**
* 接口失败标志
*/
private Map<String,String> interfaceFailFlag = new HashMap<>();
/**
* 接口超时标志
*/
private Map<String,String> interfaceTimeOutFlag = new HashMap<>();
public void setFailRate(int failRate) {
this.failRate = failRate;
}
public void setTimeOutRate(int timeOutRate) {
this.timeOutRate = timeOutRate;
}
public void setInterfaceFailRate(Map<String, Integer> interfaceFailRate) {
this.interfaceFailRate = interfaceFailRate;
}
public void setInterfaceTimeOutRate(Map<String, Integer> interfaceTimeOutRate) {
this.interfaceTimeOutRate = interfaceTimeOutRate;
}
public void setInterfaceFailFlag(Map<String, String> interfaceFailFlag) {
this.interfaceFailFlag = interfaceFailFlag;
}
public void setInterfaceTimeOutFlag(Map<String, String> interfaceTimeOutFlag) {
this.interfaceTimeOutFlag = interfaceTimeOutFlag;
}
/**
* 获取api的失败权重
* @param api
* @return
*/
public int getFaildRate(String api) {
if(interfaceFailRate.containsKey(api)) {
return interfaceFailRate.get(api);
}else {
return failRate;
}
}
/**
* 获取api的超时权重
* @param api
* @return
*/
public int getTimeOutRate(String api) {
if(interfaceTimeOutRate.containsKey(api)) {
return interfaceTimeOutRate.get(api);
}else {
return timeOutRate;
}
}
public boolean containsTimeOutFlag(Map<?,?> data) {
// TODO
return false;
}
}
问题分析:
spring-configuration-metadata.json有生成说明插件配置无误,properties没有生成说明肯定问题在于配置类的写法有问题。
百度无果,查官方文档,发现有如下描述:
Properties are discovered through the presence of standard getters and setters with special handling for collection types (that is detected even if only a getter is present).
The annotation processor also supports the use of the @Data, @Getter, and @Setter lombok annotations.
翻译:通过标准的Get和Set发现Properties属性,并且特殊处理了集合类。同时它支持了lombok的 @Data,@Getter,@Setter注解方式获取。
由此可见,我这边的问题是由于没有写标准Get方法导致的,用Ide加上Get方法,成功生成出对应Properties。
其他小伙伴可以尝试下lombok。或许会简单很多