使用gradle运行时,子类型的java Jackson反序列化失败
在与gradle进行集成测试时,我遇到了一个异常
我得到的例外是:
com.fasterxml.jackson.databind.JsonMappingException: Can not construct instance of AbstractCommonDetails: abstract types either need to be mapped to concrete types, have custom deserializer, or contain additional type information
Summary类对我试图反序列化的细节有以下注释:
@Data
public class Summary {
@JsonTypeInfo(use = NAME, include = PROPERTY, property = "@type")
@JsonSubTypes({
@JsonSubTypes.Type(value = CardDetails.class, name = "CARD")
})
private AbstractCommonDetails details;
}
抽象细节如下所示:
@Getter
@Setter
public abstract class AbstractCommonDetails {
private Long id;
public abstract String getPaymentMethod();
}
CardDetails有@JsonTypeName("CARD")
和@Data
注释以及getPaymentMethod
方法的实现
ObjectMapper配置和反序列化如下所示:
new ObjectMapper().findAndRegisterModules().readValue(IOUtils.toString(inputStream, "UTF-8"), Summary.class);
示例json:
{
"details":{
"@type":"CARD",
"amount":"10.00"
}
奇怪的是——以Junit测试的形式运行集成测试成功了,但当使用gradlew test
命令运行同一个集成测试时,它失败了,出现了前面提到的异常。原因可能是什么
# 1 楼答案
如果测试可以在
IDE
上运行,但不能在gradle
上运行,这意味着您需要查看gradle
配置。使用Lambook
,因此需要确保gradle
配置知道Lambok
注释另见: