我喜欢根据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解决方案,而不是一种新的模式/风格。