当前位置: 首页 > 知识库问答 >
问题:

为什么我不能用SnakeYaml和Lombok解析yaml字符串?

苏富
2023-03-14
package main;

import lombok.Data;
import lombok.experimental.Accessors;

@Data
@Accessors(chain = true)
public class YamlConfig {
    private String text;
}
public static void loadYaml(){
    Yaml yaml = new Yaml(new Constructor(YamlConfig.class));
    YamlConfig config = yaml.load("text: testText");
    log.info("text is {}",config.getText());
}
Exception in thread "main" Cannot create property=text for JavaBean=YamlConfig(text=null)
 in 'string', line 1, column 1:
    text: testText
    ^
No writable property 'text' on class: main.YamlConfig
 in 'string', line 1, column 7:
    text: testText
          ^

    at org.yaml.snakeyaml.constructor.Constructor$ConstructMapping.constructJavaBean2ndStep(Constructor.java:291)
    at org.yaml.snakeyaml.constructor.Constructor$ConstructMapping.construct(Constructor.java:172)
    at org.yaml.snakeyaml.constructor.Constructor$ConstructYamlObject.construct(Constructor.java:332)
    at org.yaml.snakeyaml.constructor.BaseConstructor.constructObjectNoCheck(BaseConstructor.java:230)
    at org.yaml.snakeyaml.constructor.BaseConstructor.constructObject(BaseConstructor.java:220)
    at org.yaml.snakeyaml.constructor.BaseConstructor.constructDocument(BaseConstructor.java:174)
    at org.yaml.snakeyaml.constructor.BaseConstructor.getSingleData(BaseConstructor.java:158)
    at org.yaml.snakeyaml.Yaml.loadFromReader(Yaml.java:491)
    at org.yaml.snakeyaml.Yaml.load(Yaml.java:416)
    at main.YamlLombok.loadYaml(YamlLombok.java:16)
    at main.YamlLombok.main(YamlLombok.java:11)
Caused by: org.yaml.snakeyaml.error.YAMLException: No writable property 'text' on class: main.YamlConfig
    at org.yaml.snakeyaml.constructor.Constructor$ConstructMapping.constructJavaBean2ndStep(Constructor.java:235)
    ... 10 more

当我将Bean字段切换到public时,所有工作都很好,但我真的想使用getter和setter(最好是由Lombok生成的)。

共有1个答案

益和雅
2023-03-14

我无法解析的原因是

@Accessors(chain = true)

这会导致setter返回this而不是void。

解决方案是将snakeyaml配置为使用这些setter

yaml.setBeanAccess(BeanAccess.FIELD);
 类似资料:
  • 为什么我无法解析符号“r”..??。当我在这个.class文件上创建新活动时,我会遇到一个问题,为什么我不知道在创建类之后我什么也没做。(在R.Layout.Dashboard中)。(“红色R”)。 请帮帮我.

  • 我试图将上面的文件加载到一个映射中,实体部分下的数据将映射到实体对象的集合。当我得到yaml解析器错误时,这是正确的yaml语法吗。

  • 但是当我使用Java8时, 它抛出 java.time.format.DateTimeParseException:无法分析文本“201510”:无法从TemporalAccessor获取LocalDate:{Year=2015,MontHofYear=10},ISO类型为java.time.Format.Parsed

  • 问题内容: 我想将YAML文档读取到自定义对象的映射(而不是map,默认情况下snakeYaml会这样做)。所以这: 将被加载到如下所示的地图中: 其中项目是: 我找不到使用snakeYaml做到这一点的方法,也找不到适合该任务的更好的库。 该文档仅包含将地图/集合嵌套在其他对象中的示例,因此您可以执行以下操作: 但是,当地图格式位于文档的根目录时,该如何定义呢? 问题答案: 您需要添加一个自定义

  • 问题内容: 我一直在搜索,只是找不到解释或原因,但DateFormat的parse(String)方法只是不能正确解析我的String。 我正在尝试将String解析为用于HTTP标头的日期格式,并尽可能地获取String,例如: 格式为: 但是,当我使用它时,我会从中得到: 哪一个都不像我想要的,为什么现在格林尼治标准时间之后的一年?为什么不再有逗号?为什么日期在一个月之后? 我现在对此完全感到