我有一堂课:
@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));
}当杰克逊试图解析AppealTemplateDto时,它会异常崩溃:
由: com.fasterxml.jackson.databind.exc.InvalidDefinitionException:无法构造
ru.appeal.template.dto.field.AbstractFieldDto实例(没有创建者,与默认构造一样,存在):抽象类型需要映射到具体类型、具有自定义反序列化程序或包含其他类型信息。
据我所知,杰克逊无法定义如何转换传入的AbstractFieldDto。拜托,建议我,该怎么办?
发布于 2019-05-31 13:55:41
你需要的注释是:
@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;
}https://stackoverflow.com/questions/56395909
复制相似问题