我想在我的类中使用可选类型,但每次jackson试图将传入的JSON反序列化为java类时,我都会遇到错误
java.lang.NoSuchFieldError: _valueInstantiator
at com.fasterxml.jackson.datatype.jdk8.OptionalDeserializer.withResolved(OptionalDeserializer.java:38) ~[jackson-datatype-jdk8-2.9.6.jar:2.9.6]
at com.fasterxml.jackson.datatype.jdk8.OptionalDeserializer.withResolved(OptionalDeserializer.java:10) ~[jackson-datatype-jdk8-2.9.6.jar:2.9.6]
at com.fasterxml.jackson.databind.deser.std.ReferenceTypeDeserializer.createContextual(ReferenceTypeDeserializer.java:74) ~[jackson-databind-2.8.10.jar:2.8.10]
at com.fasterxml.jackson.databind.DeserializationContext.handlePrimaryContextualization(DeserializationContext.java:650) ~[jackson-databind-2.8.10.jar:2.8.10]
at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.resolve(BeanDeserializerBase.java:490) ~[jackson-databind-2.8.10.jar:2.8.10]
at com.fasterxml.jackson.databind.deser.DeserializerCache._createAndCache2(DeserializerCache.java:293) ~[jackson-databind-2.8.10.jar:2.8.10]
我知道已经有了一条线索:
Jackson deserializing Optional throws NoSuchFieldError
和
我已经试过换衣服了
jackson-java8
对旧类型的扩展,但没有任何效果。我一直在得到
noSuchFieldError
或者,当我使用2014年的版本时,只是一个普通的空指针异常。谁能告诉我还有什么我可以试试的吗?因为我真的想用可选的,谢谢。下面是java类的代码。第一个字段导致错误:
public class SeedRecordQuery {
private Optional<List<Double>> monthlyTemperatureCurve;
private Optional<FilterWrapper> filterWrapper;
public Optional<List<Double>> getMonthlyTemperatureCurve() {
return monthlyTemperatureCurve;
}
public void setMonthlyTemperatureCurve(Optional<List<Double>> monthlyTemperatureCurve) {
this.monthlyTemperatureCurve = monthlyTemperatureCurve;
}
public Optional<FilterWrapper> getFilterWrapper() {
return filterWrapper;
}
public void setFilterWrapper(Optional<FilterWrapper> filterWrapper) {
this.filterWrapper = filterWrapper;
}
}
我试过使用非类型的
Optional
但也会发生相同的错误,因此错误不是由泛型类型引起的
List<Double>
编辑:我做了一个变通方法,允许我将JSON值作为可选值获取,但这并不理想:
private List<Double> monthlyTemperatureCurve;
private FilterWrapper filterWrapper;
@JsonIgnore
private Optional<List<Double>> monthlyTemperatureCurveOptional;
@JsonIgnore
private Optional<FilterWrapper> filterWrapperOptional;
public SeedRecordQuery() {
monthlyTemperatureCurveOptional = Optional.ofNullable(monthlyTemperatureCurve);
filterWrapperOptional = Optional.ofNullable(filterWrapper);
}