Джексон не может десериализовать Необязательно, выдает NoSuchFieldError - PullRequest
0 голосов
/ 17 сентября 2018

Я хочу использовать тип Optional в моих классах, но каждый раз, когда Джексон пытается десериализовать входящий 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]

Я знаю, что уже есть ветка об этом: десериализация Джексона Необязательные броски NoSuchFieldError и Я уже пытался изменить расширение jackson-java8 на более старый тип, но ничего не работает. Я продолжаю получать noSuchFieldError или просто исключение пустого указателя, когда я использую версию от 2014 года. Может кто-нибудь сказать мне, если есть что-то еще, что я мог бы попробовать? Потому что я действительно хочу использовать Optionals, спасибо. Вот код класса 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 Ответ

0 голосов
/ 24 сентября 2018

Вам нужно 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 в своем весеннем приложении, вы должны настроить его под свои нужды:

@Configuration
public class JacksonConfiguration {

    @Bean
    public ObjectMapper objectMapper() {
        ObjectMapper mapper = new ObjectMapper();
        mapper.registerModule(new Jdk8Module());
        return mapper;
    }
}
...