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)
为了克服这个问题,我应该遵循什么样的编程风格?唯一的方法是让我的对象变得可变吗?
我可以使用不使用默认构造函数的其他映射器吗?
您可以使用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
使用Map
json版本调用该方法.这有效地解决了这个问题.
我相信你的问题是寻找杰克逊的解决方案,而不是新的模式/风格.