首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何学习杰克逊去铸造抽象类的继承者?

如何学习杰克逊去铸造抽象类的继承者?
EN

Stack Overflow用户
提问于 2019-05-31 13:21:41
回答 1查看 475关注 0票数 2

我有一堂课:

代码语言:javascript
复制
@EqualsAndHashCode(callSuper = true)
@Data
public class AppealTemplateDto extends AbstractDto {

    private List<AbstractFieldDto> fields;
}

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

代码语言:javascript
复制
@EqualsAndHashCode(callSuper = true)
@Data
@NoArgsConstructor
public class InputFieldDto extends AbstractFieldDto {

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

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

主计长:

代码语言:javascript
复制
@PostMapping
public ResponseEntity<AppealTemplateDto> create(@RequestBody AppealTemplateDto dto) {
    return ResponseEntity.ok(service.save(dto));
}

当杰克逊试图解析AppealTemplateDto时,它会异常崩溃:

由: com.fasterxml.jackson.databind.exc.InvalidDefinitionException:无法构造ru.appeal.template.dto.field.AbstractFieldDto实例(没有创建者,与默认构造一样,存在):抽象类型需要映射到具体类型、具有自定义反序列化程序或包含其他类型信息。

据我所知,杰克逊无法定义如何转换传入的AbstractFieldDto。拜托,建议我,该怎么办?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-05-31 13:55:41

你需要的注释是:

代码语言:javascript
复制
@JsonTypeInfo
@JsonSubType

@JsonTypeName

一些说明:如果您有许多抽象类型的实现,Jackson无法猜出哪种类型是您的json,您需要在json中添加一个类型名,例如作为一个新属性(这是策略之一):

代码语言:javascript
复制
//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;
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56395909

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档