java - 为什么我无法使用 SnakeYaml 和 Lombok 解析 yaml 字符串?

标签 java lombok snakeyaml

出于某种原因,我无法通过 SnakeYaml 解析 yaml,这可能是一个基本错误,但我无法找到我错过的解决方案。

我有一个 bean :

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 生成的)。

最佳答案

我无法解析的原因是

@Accessors(chain = true)

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

解决方案是配置snakeyaml以通过以下方式使用这些 setter

yaml.setBeanAccess(BeanAccess.FIELD);

或者,您可以设置 chain = false 或将该字段设置为 public。

关于java - 为什么我无法使用 SnakeYaml 和 Lombok 解析 yaml 字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69784506/

相关文章:

java - JMS 队列上多线程消息处理的最佳实践

java - 一个类是否可以有一个仅存在于该类的实例中的数据成员(如果它不为空)?

java - 如何使用 lombok 注释从 jpa 实体注释获取字段值?

java - 从数据库中检索一个值并将其设置为Spring boot中的@Table Name值

linux - gpg : Sorry, 根本没有请求终端 - 无法获得输入

java - 在 wicket 中,如何从面板内的 ajax 组件的 onSubmit 刷新反馈面板?

java - 确保在同一 (EDT) 事件调度线程中

java - 如何在android计算器中获得±的正确功能?

python - Snakemake PICARD合并bam文件

java - 加载多个 YAML 文件(使用@ConfigurationProperties?)