我喜欢根据this article (Why objects must be immutable)使我的对象不可变。
但是,我试图使用Jackson Object Mapper解析对象。我最初是JsonMappingException: No suitable constructor found for type [simple type, class ]: cannot instantiate from JSON object.我可以通过提供默认构造函数并使字段为非最终值来解决here所提到的问题。

import lombok.AccessLevel;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.NonNull;

@AllArgsConstructor
// @NoArgsConstructor(access = AccessLevel.PRIVATE)
@Builder
@Data
public class School {

    @NonNull
    private final String schoolId;

    @NonNull
    private final String schoolName;
}
为了克服这个问题,我应该遵循什么良好的编程风格?唯一的解决方法是使我的对象可变吗?
我可以使用不使用默认构造函数的其他映射器吗?

最佳答案

您可以使用Jackson工厂(用@JsonCreator注释的方法)从 map 上读取字段并调用您的非默认构造函数:

class School {
    //fields

    public School(String id, String name) {
        this.schoolId = id;
        this.schoolName = name;
    }

    @JsonCreator
    public static School create(Map<String, Object> object) {
        return new School((String) object.get("schoolId"),
                          (String) object.get("schoolName"));
    }

    //getters
}

Jackson会使用json的create版本调用Map方法。这有效地解决了问题。

我相信您的问题是在寻找一种Jackson解决方案,而不是一种新的模式/风格。

10-06 16:05