如何学习Jackson来转换抽象类的继承者?

我有一堂课:


@EqualsAndHashCode(callSuper = true)

@Data

public class AppealTemplateDto extends AbstractDto {


    private List<AbstractFieldDto> fields;

}

此类包含AbstractFieldDto继承者列表,例如:


@EqualsAndHashCode(callSuper = true)

@Data

@NoArgsConstructor

public class InputFieldDto extends AbstractFieldDto {


    private String fieldType = FieldType.INPUT.name();

    private String text;

}

总共有近 6-7 个继承者,而 AbstractTemplateDto 可能包含其中的任何一组。


控制器:


@PostMapping

public 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。请教我,该怎么办?


守着一只汪
浏览 100回答 1
1回答

holdtom

您需要的注释是:@JsonTypeInfo@JsonSubType@JsonTypeName一些解释:如果你有很多抽象类型的实现,Jackson 无法猜测你的 json 是哪种类型,你需要在 json 中添加一个类型名称,例如作为一个新属性(这是策略之一)://tell to jackson where to find the type name@JsonTypeInfo(&nbsp; &nbsp;use = JsonTypeInfo.Id.NAME, include = As.PROPERTY, property = "type")// tell to jackson the implementations to scan@JsonSubTypes({&nbsp; &nbsp; @JsonSubTypes.Type(value = InputFieldDto.class, name = "input")&nbsp; &nbsp; //, ...})public class AbstractFieldDto {}//tell to jackson what is the type name in json@JsonTypeName("input")public class InputFieldDto extends AbstractFieldDto {&nbsp; &nbsp; private String fieldType = FieldType.INPUT.name();&nbsp; &nbsp; private String text;}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java