如何为不可变类创建默认构造函数

Syn*_*ter 8 java immutability jackson lombok

我喜欢根据这篇文章使我的对象不可变(为什么对象必须是不可变的).

但是,我试图使用Jackson Object Mapper解析一个对象.我最初得到了JsonMappingException: No suitable constructor found for type [simple type, class ]: cannot instantiate from JSON object.

如前所述我可以修复它在这里,通过提供一个默认的构造,使我场的非决赛.

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;
}
Run Code Online (Sandbox Code Playgroud)

为了克服这个问题,我应该遵循什么样的编程风格?唯一的方法是让我的对象变得可变吗?

我可以使用不使用默认构造函数的其他映射器吗?

ern*_*t_k 6

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

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
}
Run Code Online (Sandbox Code Playgroud)

杰克逊将create使用Mapjson版本调用该方法.这有效地解决了这个问题.

我相信你的问题是寻找杰克逊的解决方案,而不是新的模式/风格.