【问题标题】:SnakeYaml error: No writable property on classSnakeYaml 错误:类上没有可写属性
【发布时间】:2018-07-01 10:05:05
【问题描述】:

我犯了一个愚蠢的错误?我是yaml的新手。不知道为什么,但我的系统没有看到我的名为“name”的变量。

Full error

错误:

cannot create property=name for JavaBean=x.ModuleDescription@7ce6a65d

我的班级:

@Data
@NoArgsConstructor
@AllArgsConstructor
public class ModuleDescription {

    private String name;
    private String main;

    private String version = "unknown";
    private String author = "unknown";

    @Setter
    private File file = null;
}

我可以看到这个字段,但我的系统没有。希望有人有想法。谢谢!

【问题讨论】:

    标签: java yaml snakeyaml


    【解决方案1】:

    那么您将字段 name 声明为 private,这将禁止其他任何人访问该字段。默认情况下,SnakeYAML 仅加载公共字段和 属性,即具有公共 getter 和 setter 的值。

    因此,一个简单的解决方法是将name 的公共getter 和setter 添加到类中:

    public String getName() {
        return name;
    }
    public void setName(final String value) {
        name = value;
    }
    

    对于加载,您需要 setter;对于倾销,你需要吸气剂。或者,您可以声明字段 public

    如果您真的想要保持字段私有并且添加任何公共getter / setter,这也可以工作(未经测试):

    Yaml yaml = new Yaml();
    yaml.setBeanAccess(BeanAccess.FIELD);
    ModuleDescription desc = yaml.loadAs(/* YAML source here */,
                                         ModuleDescription.class);
    

    【讨论】:

    • 但是当我使用@Data 时,我仍然为每个字段提供了一个公共获取和设置?我不是吗?
    • 我不知道@Data 是什么,并且您没有在问题的标签中引用包含它的库,所以我忽略了它(总是添加相关标签以便人们了解您的完整软件堆栈!)。无论如何,SnakeYAML 不知道@Data 做了什么。要使用 SnakeYAML,可能需要向 SnakeYAML 添加支持。
    猜你喜欢
    • 2019-03-08
    • 2016-08-30
    • 1970-01-01
    • 1970-01-01
    • 2013-11-30
    • 1970-01-01
    • 2016-05-11
    • 2021-03-10
    • 2023-03-09
    相关资源
    最近更新 更多