代码之家  ›  专栏  ›  技术社区  ›  Maurice

Jackson无法反序列化可选项,抛出NoSuchFieldError

  •  1
  • Maurice  · 技术社区  · 7 年前

    我想在我的类中使用可选类型,但每次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);
    }
    
    1 回复  |  直到 7 年前
        1
  •  0
  •   f-CJ    7 年前

    你需要 jackson-datatype-jdk8 但您还需要注册 Jdk8Module 在你的地图上。

    ObjectMapper mapper = new ObjectMapper();
    mapper.registerModule(new Jdk8Module());
    String json = "{\"monthlyTemperatureCurve\":[2.5,4.3]}";
    SeedRecordQuery seedRecordQuery = mapper.readValue(json, SeedRecordQuery.class);
    

    编辑

    如果您使用的是全局配置的 ObjectMapper 在spring应用程序中,您必须根据需要对其进行配置:

    @Configuration
    public class JacksonConfiguration {
    
        @Bean
        public ObjectMapper objectMapper() {
            ObjectMapper mapper = new ObjectMapper();
            mapper.registerModule(new Jdk8Module());
            return mapper;
        }
    }
    
    推荐文章