Java内省踩坑记录
1.背景描述
有个功能需要将
yml
的内容转成一个POJO
。但是在项目启动时出现了报错。
问题现场
-
yml文件内容:
xField: "time"
yField: "total_pct"
-
pojo定义:
@Data
public class ChartBean {
private String xField;
private String yField;
}
-
启动方法:
public class ChartYmlConfUtil {
private final static ThreadLocal<Yaml> YAML = ThreadLocal.withInitial(Yaml::new);
// yml转换为javabean的方法
public static ChartBean load(String path) {
final Yaml yaml = ChartYmlConfUtil.YAML.get();
try (final InputStream inputStream = ChartYmlConfUtil.class.getResourceAsStream(path)) {
final String conf = CharStreams.toString(new InputStreamReader(inputStream));
return yaml.loadAs(conf, ChartBean.class);
} catch (IOException e) {
throw new RuntimeException(String.format("load yaml from [%s] error", path), e);
}
}
// 启动
public static void main(String[] args) {
load("/chart.yml");
}
}
-
报错信息:
Exception in thread "main" Cannot create property=xField for JavaBean=ChartBean(xField=null, yField=null)
in 'string', line 1, column 1:
xField: "time"
^
Unable to find property 'xField' on class: com.xyq.test.yml.ChartBean
in 'string', line 1, column 9:
xField: "time"
^
at org.yaml.snakeyaml.constructor.Constructor$ConstructMapping.constructJavaBean2ndStep(Constructor.java:313)
at org.yaml.snakeyaml.constructor.Constructor$ConstructMapping.construct(Constructor.java:190)
at org.yaml.snakeya