亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何學習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 關注
  • 116 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號