Jackson多态反序列化报错:Unrecognized field 'files'求助
问题排查与解决
错误根源
你的Jackson多态注解配置和请求JSON结构不匹配,导致反序列化失败:
- 基类
MriImportRequest上的@JsonTypeInfo使用了include = As.WRAPPER_OBJECT,这要求整个子类实例必须被类型名称(files/sheets)的对象包裹,且这个包裹对象对应property = "settings"指定的字段。 - 但你当前的请求JSON中,
settings字段同时包含files子对象和基类的folderId/currency/locale字段,Jackson会尝试直接把settings解析为MriImportRequest实例,而该类没有files属性,因此抛出「Unrecognized field 'files'」错误。
两种修复方案
方案1:调整请求JSON结构(推荐,无需修改代码)
按照WRAPPER_OBJECT的规则,将基类字段移入files对象内部,settings直接指向这个files对象:
{ "importType": "mri", "resourceUri": "riskdata/v1/exposuresets/es1/exposures/sdfd-2232-skdj-3434/portfolios/12", "settings": { "files": { "accountsFileId": 5387, "locationsFileId": 5388, "reinsuranceFileId": 5389, "mappingFileId": 5390, "folderId": 1686, "currency": "USD", "locale": "US" } } }
方案2:修改Jackson注解配置(适配现有JSON结构)
如果不想调整请求JSON,可将@JsonTypeInfo的include改为As.PROPERTY,通过内部字段标识类型:
- 修改基类
MriImportRequest的注解:
@JsonTypeInfo(use = Id.NAME, include = As.PROPERTY, property = "type") @JsonIgnoreProperties(ignoreUnknown = true) @JsonSubTypes({ @JsonSubTypes.Type(value = MriExcelImportRequest.class, name = "sheets"), @JsonSubTypes.Type(value = MriTextFileImportRequest.class, name = "files") }) public class MriImportRequest { private int folderId; private String locale; private String currency; }
- 更新请求JSON,在
settings内添加type字段指定类型:
{ "importType": "mri", "resourceUri": "riskdata/v1/exposuresets/es1/exposures/sdfd-2232-skdj-3434/portfolios/12", "settings": { "type": "files", "accountsFileId": 5387, "locationsFileId": 5388, "reinsuranceFileId": 5389, "mappingFileId": 5390, "folderId": 1686, "currency": "USD", "locale": "US" } }
补充说明
As.WRAPPER_OBJECT适合层级分明的结构,用类型名称作为实例的外层容器;As.PROPERTY则通过实例内部的标识字段区分类型,更贴近常规JSON结构习惯。
内容的提问来源于stack exchange,提问作者user3897533
相关产品推荐
相关产品推荐

