java - 使用 SnakeYaml 处理缺失字段

标签 java serialization deserialization yaml snakeyaml

假设我有一个简单的类,它包含两个字段:getter 和 setter。我有时想序列化和反序列化这个类的对象。

public class Foo {
    private String a;
    private int b;

    public void setA(String a) {
        System.out.println("a setter called");
        this.a = Objects.requireNonNull(a, "Required non null field.");
    }

    public void setB(int b) {
        System.out.println("b setter called");
        this.b = b;
    }

    public String getA() {
        return a;
    }

    public int getB() {
        return b;
    }

    public static void main(String[] args) {
        Representer representer = new Representer();
        representer.getPropertyUtils().setSkipMissingProperties(false);
        Yaml yaml = new Yaml(new Constructor(), representer);
        String doc = "b: 10";
        Foo testBean = yaml.loadAs(doc, Foo.class);
    }
}

我希望 main 方法中的代码抛出一些异常,因为 doc 中缺少字段 a。不幸的是,它在默认情况下不起作用。

我能以某种方式配置 SnakeYaml 吗?

最佳答案

使用构建器模式可能是最好的方法。将所有这些放在一起,最终使用 Jackson 更容易做到这一点(不确定 SnakeYaml 本身是否可行)和构建器的 Immutables ( https://immutables.github.io/ )。

请注意,您可以自己编写构建器,并且可以在 build() 中进行验证构建器的方法,但 Immutables 使这一切变得更容易一些。

首先,你的模型类:

@Value.Immutable
@JsonDeserialize(builder = ImmutableFoo.Builder.class)
public interface Foo {
    String getA();
    int getB();
}

请注意,默认情况下 getA()不能返回 null(如果您想更改该行为,可以使用 @Nullable 对其进行注释或将其设为 Optional<String>)。运行注释处理器后,您将得到一个 ImmutableFoo。使用具有所需语义的构建器进行分类。

然后将你的反序列化切换为使用 Jackson(它显然在底层使用了 SnakeYaml,所以应该不会有太大的不同):

new ObjectMapper(new YAMLFactory()).readValue("b: 10", Foo.class);

这将抛出一个 JsonMappingException其原因在于构建器:

java.lang.IllegalStateException: Cannot build Foo, some of required attributes are not set [a]

如果你想避免不可变,你可以在你自己的构建器中进行这种验证。

关于java - 使用 SnakeYaml 处理缺失字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43735911/

相关文章:

JavaFX FXML 访问通过 Lookup() 方法成功,但通过 @FXML 注释失败

java - 实现和扩展一个类

Java : Take screenshot of visible area in the browser

json - 如何将Json反序列化为对象

serialization - 如何序列化 boost::interprocess::containers::vector

java - 如何使用 jackson 将自定义解串器添加到接口(interface)

java - Spring Security 多个成功和失败处理程序不能很好地工作

c# - Xmlserializer 不序列化基类成员

json - 无法从来自 ElasticSearch 的 JSON 反序列化 LifeRay 服务模型对象,未找到默认构造函数

c# - JSON.NET 不区分大小写的反序列化不起作用