为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

守着一只汪 2022-12-28 14:27:54
我有一堂课:@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;

}


查看完整回答
反对 回复 2022-12-28
  • 1 回答
  • 0 关注
  • 99 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信