简体   繁体   English

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

[英]Why can't I parse a yaml string with SnakeYaml and Lombok?

I can't parse a yaml via SnakeYaml for some reason, its probably a basic mistake but I was not able to find a solution what I missed.由于某种原因,我无法通过 SnakeYaml 解析 yaml,这可能是一个基本错误,但我无法找到我错过的解决方案。

I have a Bean:我有一个豆子:

package main;

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

@Data
@Accessors(chain = true)
public class YamlConfig {
    private String text;
}

and a simple test和一个简单的测试

public static void loadYaml(){
    Yaml yaml = new Yaml(new Constructor(YamlConfig.class));
    YamlConfig config = yaml.load("text: testText");
    log.info("text is {}",config.getText());
}

yet what I keep getting is然而我不断得到的是

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

and was not able to pinpoint the root cause.并且无法查明根本原因。

Any suggestions as to what I am doing wrong?关于我做错了什么的任何建议?

When I switch the Bean field to public all works well, but I would really like to use getters and setters (preferably those generated by Lombok).当我将 Bean 字段切换为 public 时一切正常,但我真的很想使用 getter 和 setter(最好是由 Lombok 生成的那些)。

The reason why I was unable to parse was我无法解析的原因是

@Accessors(chain = true)

which causes setters to return this instead of void.这会导致 setter 返回 this 而不是 void。

The solution is to configure snakeyaml to work with these setters via解决方案是通过配置snakeyaml 与这些setter 一起工作

yaml.setBeanAccess(BeanAccess.FIELD);

Alternatively, you can set chain = false or set the field to public.或者,您可以设置 chain = false 或将该字段设置为 public。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM