gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 10:03:05 25 4
gpt4 key购买 nike

我有一个类:

@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 可能包含其中的任何一组。

Controller :

@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): abstract types either need to be mapped to concrete types, have custom deserializer, or contain additional type information

据我了解,Jackson 无法定义如何将传入的 AbstractFieldDto 转换。请给我建议,该怎么做?

最佳答案

您需要的注释是:

@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;
}

关于java - 如何学习Jackson来转换抽象类的继承者?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56395909/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com