我有一堂课:@EqualsAndHashCode(callSuper = true)@Datapublic class AppealTemplateDto extends AbstractDto { private List<AbstractFieldDto> fields;}此类包含AbstractFieldDto继承者列表,例如:@EqualsAndHashCode(callSuper = true)@Data@NoArgsConstructorpublic class InputFieldDto extends AbstractFieldDto { private String fieldType = FieldType.INPUT.name(); private String text;}总共有近 6-7 个继承者,而 AbstractTemplateDto 可能包含其中的任何一组。控制器:@PostMappingpublic ResponseEntity<AppealTemplateDto> create(@RequestBody AppealTemplateDto dto) { return ResponseEntity.ok(service.save(dto));}当 Jackson 试图解析AppealTemplateDto时,它异常崩溃:Caused by: com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of ru.appeal.template.dto.field.AbstractFieldDto (no Creators, like default construct, exist): 抽象类型要么需要映射到具体类型,要么有自定义反序列化器,要么包含额外的类型信息据我了解,杰克逊无法定义如何投射 incoming AbstractFieldDto。请教我,该怎么办?
1 回答
holdtom
TA贡献1805条经验 获得超10个赞
您需要的注释是:
@JsonTypeInfo
@JsonSubType
@JsonTypeName
一些解释:如果你有很多抽象类型的实现,Jackson 无法猜测你的 json 是哪种类型,你需要在 json 中添加一个类型名称,例如作为一个新属性(这是策略之一):
//tell to jackson where to find the type name
@JsonTypeInfo( use = JsonTypeInfo.Id.NAME, include = As.PROPERTY, property = "type")
// tell to jackson the implementations to scan
@JsonSubTypes({
@JsonSubTypes.Type(value = InputFieldDto.class, name = "input")
//, ...
})
public class AbstractFieldDto {
}
//tell to jackson what is the type name in json
@JsonTypeName("input")
public class InputFieldDto extends AbstractFieldDto {
private String fieldType = FieldType.INPUT.name();
private String text;
}
添加回答
举报
0/150
提交
取消